为什么C语言中两种整数运算顺序的截断表现不一致?
差异原因说明
这个表现和现代C版本的新特性没有任何关系,是C语言从最早的K&R C时期就明确规定的整数运算规则、运算符优先级与结合性导致的,核心逻辑如下:
- C语言中
*、/运算符优先级相同,结合方向为从左到右 - 两个int类型操作数参与运算时,返回值也为int类型,整数除法会直接舍弃小数部分向零截断
第一种写法 cels = (fahr - 32) * 5 / 9;
运算顺序严格按照从左到右执行:
- 先计算括号内的
fahr - 32,得到int类型的温度差值 - 用差值先乘以5,得到放大后的int类型结果
- 最后用该结果除以9,此时的整数截断只会舍弃最终结果的小数部分,和K&R推荐的
5 * (fahr - 32) / 9逻辑完全等价,不会出现整体结果异常的问题。
第二种写法 cels = 5 / 9 * (fahr - 32);
同样按照从左到右的顺序执行:
- 优先计算
5 / 9,两个操作数都是int,整数除法结果直接截断为0 - 0再乘以任意整数结果都为0,就出现了你观测到的异常截断问题。
注意:只有当除法操作涉及的两个数都是整数时才会触发整数截断规则,如果要避免该问题,可以将其中一个操作数强制转为浮点类型,比如写成
cels = 5.0 / 9 * (fahr - 32);就可以得到正确结果。
内容的提问来源于stack exchange,提问作者airismything
相关产品推荐
相关产品推荐

