F=(9/5*C)和#x2B;32和F=(C*9/5)和#x2B;32 ? 优先?
F=(C*9/5)+32和F=(9/5*C)+32产生两个不同的结果,尽管C的输入相同。我知道运算符中有某种优先级,但我不确定。乘法先于除法吗 输入值为20时,第一种情况下的华氏值为68(正确值),第二种情况下的华氏值为52F=(9/5*C)和#x2B;32和F=(C*9/5)和#x2B;32 ? 优先?,c,operators,operator-precedence,C,Operators,Operator Precedence,F=(C*9/5)+32和F=(9/5*C)+32产生两个不同的结果,尽管C的输入相同。我知道运算符中有某种优先级,但我不确定。乘法先于除法吗 输入值为20时,第一种情况下的华氏值为68(正确值),第二种情况下的华氏值为52 #include<stdio.h> int main() { float cel , fahr ; printf("Enter the temperature(C): "); scanf("%f",&cel); fah
#include<stdio.h>
int main()
{
float cel , fahr ;
printf("Enter the temperature(C): ");
scanf("%f",&cel);
fahr = (9/5 * celt is ) + 32;
printf("\nThe temperature in fahranheit is %f ",fahr);
}
#包括
int main()
{
漂浮细胞,fahr;
printf(“输入温度(C):”;
scanf(“%f”和&cel);
fahr=(9/5*celt为)+32;
printf(“\n华氏温度为%f”,华氏度);
}
对于上述代码,预期结果为68,但实际结果为52。如果我切换“9/5”和“cel”的位置,它会给出正确的结果。为什么会这样?是的,优先级(和整数算术)
他们的评价如下:
F = ((C * 9)/5 ) + 32;
vs
C执行整数运算的方式(它将整数截断为零)使得第二个不正确(9/5
为一)
相反,使用
9.f
、5.f
和32.f
。这样,优先级就不会有太大变化(而且你会得到正确的结果)。除了优先级问题之外,9/5
的结果是1
。如果写出来的话,它会更像预期的那样工作
9.0/5 or
9/5.0 or
9.0/5.0 or (even)
1.8
乘法和除法在C中具有同等的优先级,并且具有从左到右的结合性。所以
相当于F=(C*9/5)+32
F=((C*9)/5)+32
相当于F=(9/5*C)+32
F=((9/5)*C)+32
int/int=int
,丢弃了其余的表达式。因此,9/5
并不像您预期的那样是1.8,而是1
要通过除以两个int
s得到浮点结果,需要将至少一个操作数转换为float
或double
。因此,不要写9/5
,而是写:
,9.0/5.0
,9.0/5
,或9/5.0
,这会给您一个1.8
双精度
,或
,9.0f/5.0f
,9.0f/5
,或9/5.0f
,它们为您提供了一个1.8f
浮动
- 此表达式
C * 9/5
C * 9
9/5 * C
9/5
从左到右计算,因为使用的运算符具有相同的优先级
因此,它的评估如下
( C * 9 ) / 5
(9/5) * C
每次对子表达式求值时,编译器都会确定所用操作数的公共类型
子表达式的公共类型
C * 9/5
C * 9
9/5 * C
9/5
根据通常的算术转换,是浮点。所以这个子表达式的结果有类型float和整个表达式的结果
( C * 9 ) / 5
是相应的有类型浮动
这句话
C * 9/5
C * 9
9/5 * C
9/5
被评估为
( C * 9 ) / 5
(9/5) * C
作为子表达式的两个操作数
C * 9/5
C * 9
9/5 * C
9/5
是整数,然后使用整数运算,子表达式的结果也是整数
例如,为了避免操作数顺序的依赖性,可以编写
(9.f/5) * C
或
在本例中,子表达式
8.0f/5
及
作为带有浮点数的表达式进行计算。如果使用9.0/5,会得到什么结果?(还有:华氏。)那不会编译…@Geo Mukkath什么是“celt”?复制/粘贴您实际尝试过的代码。不要忘记
f
后缀。OP处理的是float
s.@JL2210:除了最挑剔的编译器外,不需要显式类型后缀f
。表达式在赋值到fahr
时将被计算为double
,并被截断为float
。是的,但一般来说,尽量避免隐式类型更改(当您不注意时,它们会让您感到惊讶)。@JL2210隐式类型转换是该语言的一项功能。避免他们是愚蠢的;这样做首先否定了使用高阶语言的效用。当然,你必须学会避免一些陷阱(这个问题说明了一个很好的陷阱),但我不同意你关于“避免隐式类型更改”的笼统建议。隐式类型转换可以(而且通常会)产生程序员所期望的值以外的值。这就是为什么编译器(启用警告时)会输出一条关于问题的警告消息,因此F=((C*9)/5)+32
比F=((9/5)*C)+32
更精确。不,表达式:9/5
由于细分的整数截断,结果为1。最好使用所有浮点,因为问题是关于温度:F=9.0/5.0*C+32.0代码>转换温度时,最好以科学家的身份思考,而不是以汇编程序员的身份思考:)天哪!这个程序是K&R书籍的第二个例子!!!没人读过吗?为什么每个人都坚持使用整数,而所有的运算都是在浮点数中完成的?使用这种方法,C的新手会认为使用浮点文本是一项昂贵的任务。没有什么比现实更离谱的了。