C++中带括号与不带括号的算术表达式输出差异原因咨询
为什么给
5/9加上括号后,C++代码输出全为0? 这问题的核心在于整数运算的优先级与括号强制改变运算顺序的差异,咱们一步步拆解:
先看正常工作的表达式:answers[i] = (a - 32) * 5/9;
在C++中,乘法*和除法/属于同一优先级,并且是左结合的——也就是说运算会从左到右依次执行:
- 先计算
a - 32,得到一个整数结果; - 用这个结果乘以
5,得到一个更大的整数(比如如果a=68,这一步就是36*5=180); - 最后用这个乘积除以
9,执行整数除法(只保留商的整数部分,比如180/9=20)。
这时候只要(a-32)*5的结果大于等于9,就不会得到0,所以输出正常。
再看出问题的表达式:answers[i] = (a - 32) * (5/9);
这里的括号直接改变了运算顺序:
- 括号的优先级最高,所以会先计算
5/9; - 因为
5和9都是整数,C++会执行整数除法,结果直接取商的整数部分——5除以9商是0,余数5被丢弃,所以5/9的结果是0; - 接下来不管
(a-32)的结果是多少,乘以0之后结果都是0,自然所有输出全为0。
简单来说,括号在这里强制让整数除法5/9先执行,提前得到了0,而正常表达式是先做乘法得到一个非零的中间值,再做除法。如果想要避免这个问题,你可以把其中一个数改成浮点数,比如写成5.0/9或者5/9.0,这样就会执行浮点数运算,结果就不会是0了。
内容的提问来源于stack exchange,提问作者Programming Rage
相关产品推荐
相关产品推荐

