C,Celsius到Fahrenheit的运算符优先级

时间:2018-06-06 12:01:04

标签: c

我有这段代码使用各种表达式将摄氏温度转换为华氏温度:

#include <stdio.h>

int main()
{
    double temf;
    double temc = 17.0;

    temf = (9 / 5) * temc + 32;
    printf("%g\n", temf);

    temf = 9 / 5 * temc + 32;
    printf("%g\n", temf);

    temf = 9 * temc / 5 + 32;
    printf("%g\n", temf);

    temf = 32 + 9 * temc / 5;
    printf("%g\n", temf);

    system("pause");
    return 0;
}

它返回

49
49
62.6
62.6

有人可以向我解释原因吗

(9/5) * 17.0 + 32 = 17.0 + 32

键入前2个计算时执行的实际表达式是什么?

2 个答案:

答案 0 :(得分:4)

(9. / 5.) = 1.8是双重分割,(9/6) = 1是int division。

#include <stdio.h>

int main()
{
    double temf;
    double temc = 17.0;

    temf = (9. / 5.) * temc + 32.;
    printf("%g\n", temf);

    temf = 9. / 5. * temc + 32.;
    printf("%g\n", temf);

    temf = 9. * temc / 5. + 32.;
    printf("%g\n", temf);

    temf = 32. + 9. * temc / 5.;
    printf("%g\n", temf);
}

结果:

62.6
62.6
62.6
62.6

答案 1 :(得分:4)

在C中,你应该注意数值常量的类型,常量本身将决定它将具有什么类型。如果你写一个常量为sparse_softmax_cross_entropy_with_logits那么它将是一个整数,如果你写9那么它将是一个双精度,如果你写9.0,那么它将是一个浮点数。 / p>

因此,如果您只键入9.0f,那么它将是一个整数除法,并且将遵循整数除法的规则。整数/运算符的结果是代数商,丢弃任何小数部分。 9/5,如果我们丢弃小数部分,那么它将是9/5 = 1.81

要获得正确的结果,你应该写1 * 17.0 = 17.0,这将是两个双值的除法,结果将是1.8的双倍。