F=(9/5*C)和#x2B;32和F=(C*9/5)和#x2B;32 ? 优先?

F=(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

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);
    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
这两个表达式在代数上是等价的,除了C定义了
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的新手会认为使用浮点文本是一项昂贵的任务。没有什么比现实更离谱的了。