C中的华氏换算公式问题

C中的华氏换算公式问题,c,C,用C编写程序将摄氏度转换为华氏度时,以下公式给出的输出不正确: int fahr = 9 / 5 * celsius + 32; 现在,我了解到9/5被解释为整数可能是一个问题,但我不理解的是,使用double或float仍然会给出同样不正确的输出 奇怪的是,下面的公式给出了正确的输出,尽管还将类型设置为int: int fahr = celsius / 5 * 9 + 32; 此外,我注意到,即使是像下面这样简单的事情,当类型设置为double时,输出仍然是1.0而不是1.8:

用C编写程序将摄氏度转换为华氏度时,以下公式给出的输出不正确:

    int fahr = 9 / 5 * celsius + 32;
现在,我了解到9/5被解释为整数可能是一个问题,但我不理解的是,使用
double
float
仍然会给出同样不正确的输出

奇怪的是,下面的公式给出了正确的输出,尽管还将类型设置为
int

int fahr = celsius / 5 * 9 + 32;
此外,我注意到,即使是像下面这样简单的事情,当类型设置为
double
时,输出仍然是1.0而不是1.8:

 double x = 9 / 5;
 printf("%lf\n", x);
我读过这个帖子:


但我还是不明白为什么
intfahr=cellices/5*9+32有效,但不
int fahr=9/5*摄氏度+32

您正在使用整数进行数学运算。这句话:

9 / 5
int fahr = celsius / 5 * 9 + 32;
int fahr = celsius * 9.0 / 5 + 32;
在C中产生
1
。当您说您使用了
double
float
时,您可能只是更改了
fahr
的类型,这对assignemtn运算符右侧发生的操作没有任何影响。要获得正确的行为,您还需要将这些常量中的至少一个设置为双倍:

9.0 / 5
同样,在本声明中:

double x = 9 / 5;
您仍在进行整数运算,然后将结果分配给
double
变量。没有别的事了。通过执行以下操作之一,您将获得正确答案:

double x = 9.0 / 5;
double x = 9 / 5.0;
double x = 9.0 / 5.0;
使用此表达式的原因:

9 / 5
int fahr = celsius / 5 * 9 + 32;
int fahr = celsius * 9.0 / 5 + 32;
似乎工作只是一个操作顺序的事情-这里你把输入除以5,然后乘以9,而不是先做常量运算。您仍然可以通过以下操作获得更准确的答案:

int fahr = celsius * 9 / 5 + 32;
除此之外,您还可以在以下表达式中进行浮点运算:

9 / 5
int fahr = celsius / 5 * 9 + 32;
int fahr = celsius * 9.0 / 5 + 32;
如果您想使用整数进行原始计算,您当然可以-您只需要在除法之前进行乘法:

int fahr = 9 * celsius / 5 + 32;

此表达式相当于上面使用的表达式之一。

每个表达式或子表达式的类型(在大多数情况下)的计算不考虑其出现的上下文

在本宣言中:

double x = 9 / 5;
初始化表达式为
9/5
;它由两个
int
表达式和一个除法运算符组成。由于
/
的操作数属于
int
类型,因此它是一个
int
除法,产生一个
int
值。由于整数除法截断,结果为
1
,类型为
int

然后使用该表达式的结果初始化
x
。由于
x
的类型为
double
,因此将值从
int
隐式转换为
double
,从而导致
x
保留值
1.0

如果希望
x
的值为
1.8
,则需要进行浮点除法,这意味着需要浮点操作数。最简单、最清晰的方法是:

double x = 9.0 / 5.0;
还有其他几种(不太清楚的)方法。如果一个
/
运算符有两个操作数,一个是
int
类型,另一个是
double
,则
int
操作数将升级为
double
,因此这两个操作数中的任何一个也将
x
设置为
1.8

double x = 9.0 / 5;
/* or */
double x = 9 / 5.0;
但要注意这种方法:

double y = 9 / 5 / 3.0;
这相当于:

double y = (9 / 5) / 3.0;
它将
9/5
计算为
int
,得到
1
,然后将该结果提升为
double
,并将其除以
3.0
,得到
0.333

关键是,表达式的上下文不会将类型强加给表达式或其操作数;表达式的计算方式就像它是孤立的一样,然后结果可能会根据其上下文进行转换。

我仍然不明白为什么
int fahr=cellices/5*9+32有效,但不
int fahr=9/5*摄氏度+32

对于前者,您可能将
摄氏度
声明为
浮点
双精度
,从而使整个右侧都按此方式计算。假设您使用了
float
,它的工作原理如下:

celsius / 5 * 9 + 32
(celsius / 5.0) * 9 + 32
(celsius / 5.0 * 9.0) + 32
(celsius / 5.0 * 9.0 + 32.0)
对于后者,
9/5
是一种整数算术,其计算结果为
1
,然后其他数学运算作为浮点运算。在这种情况下:

9 / 5 * celsius + 32
1 * celsius + 32 // Because of this, you get an incorrect answer
celsius + 32
celsius + 32.0
请注意,左侧的类型与此无关;对右侧进行评估时不考虑这一点

更新:您说的
摄氏度
是一个
整数
,这意味着您碰巧运气好,用一个
5
的倍数进行测试,在对语句的其余部分执行有效的整数运算之前,给您一个正确的整数结果,即
摄氏度/5
。在第二个示例中,使用
5的倍数对您没有帮助


无论如何,现在你知道你为什么幸运了,但是链接的问题给出了你实际需要做的事情的答案,当
摄氏度
不是
5的倍数时,公式可以工作:使用浮点数学,正如所有答案所示。

我理解这一点。请通读这篇文章。@Tanger,我想你不会。为了更好地解释,我进行了编辑。好吧,那么为什么这样做:int fahr=摄氏度/5*9+32?我添加了另一个编辑来涵盖这一点。因为手术是从左到右进行的。好的,谢谢。关于你的陈述“这里你把输入除以5,然后再乘以9,而不是先做常数运算”,我还是有点不清楚,因为我把摄氏度也设为int,所以它实际上只是除以整数,就像9/5一样。你是说用一个整型变量而不是常数是造成差异的原因(即使变量被赋予与常数相同的值)?因为9和5被视为整数。试试9.0/5.0这是一个典型的新手错误。因为真正的男人