【问题标题】:Why do these parentheses give different answers in C?为什么这些括号在 C 语言中给出不同的答案?
【发布时间】:2020-08-21 17:49:57
【问题描述】:
我正在研究 CS50 PS 2 的可读性,但在年级水平上得到了不正确的输出。
调试显示输入值正确,但输出错误。使用输入的手工计算给出了正确的答案。
我简化了方程式的第一部分并发现:
将214 的值用于L 和56 用于W,表达式:
float R = (0.0588 * (L / W) * 100);
输出17.64,这是错误的。
当我使用时:
float R = (0.0588 * L / W * 100);
它输出22.47,这是正确的。
我不知道为什么。
【问题讨论】:
标签:
c
cs50
parentheses
arithmetic-expressions
integer-division
【解决方案1】:
表达式
float R = (0.0588 * (L / W) * 100);
会发展到
float R = 0,0588 * 3 * 100;
这是17.64,四舍五入到小数点后两位。
L / Winteger division 的结果是int,因此结果3.8... 将被截断为3。
要更正此问题,W 或 L 变量中的至少一个必须是 float 或 double 类型。
表达式
float R = (0.0588 * L / W * 100);
会发展到
float R = ((0,0588 * 214) / 24) * 100 //parenthesis to illustrate the sequence
当四舍五入到小数点后两位时输出正确的结果22.47。
【解决方案2】:
L 和 W 都被声明为 int 的可能性很大。那么在第一种情况下,(L/W) 也将被视为int,因此被地板化,从而导致错误。
旁注:即使它们被声明为float 或double,浮点算术也意味着乘法和除法不是关联的。