为什么这些括号在 C 中给出不同的答案?

Why do these parentheses give different answers in C?

我正在研究 CS50 PS 2 的可读性,并且在年级水平上得到了不正确的输出。

调试显示输入值正确,但输出错误。使用输入的手工计算给出了正确的答案。

我简化了等式的第一部分并发现:

L使用214的值,对W使用56的值,表达式:

float R = (0.0588 * (L / W) * 100);

输出17.64,这是错误的。

当我使用:

float R = (0.0588 * L / W * 100);

它输出22.47,这是正确的。

我不明白为什么。

很有可能 LW 都声明为 int。那么在第一种情况下,(L/W) 也将被视为一个 int,因此被 floored,从而导致错误。

旁注:即使它们被声明为 floatdouble,浮点运算也意味着乘法和除法不是关联的。

表达式

float R = (0.0588 * (L / W) * 100);

会发展到

float R = 0,0588 * 3 * 100;

这是 17.64,四舍五入到小数点后两位。

L / W integer division 的结果是 int,因此结果 3.8... 将被截断为 3

要更正此问题,变量 WL 中至少有一个必须是 floatdouble 类型。

表达式

float R = (0.0588 * L / W * 100);

会发展到

float R = ((0,0588 * 214) / 24) * 100 //parenthesis to illustrate the sequence 

四舍五入到小数点后两位时输出正确的结果22.47