为何C++中给5/9加括号后温度转换结果为0?
问题原因分析
核心问题出在C++的整数除法规则上:
- 当两个整数进行除法运算时,C++会执行截断式整数除法——直接丢弃小数部分,只保留整数结果。
5和9都是整数字面量,所以5/9的计算结果是0,而非数学上的0.555...。
两种写法的运算差异
加括号的情况:(temperature_farenheit - 32) * (5 / 9)
括号强制改变了运算优先级,程序会先计算括号内的5/9,得到整数结果0;再用前面(47-32)=15(此时是double类型)乘以0,最终结果自然是0。
不加括号的情况:(temperature_farenheit - 32) * 5 / 9
运算顺序遵循乘除从左到右的规则:
- 先计算
(47-32)=15,由于temperature_farenheit是double类型,结果为double的15.0; - 乘以整数
5时,整数会被自动提升为double类型,得到75.0; - 再除以整数
9,同样9被提升为double,执行浮点数除法得到8.33333。
和Python的区别
Python 3中,/运算符默认执行浮点数除法,哪怕操作数是整数,5/9也会直接返回0.555...的浮点数结果,因此相乘后得到正确的计算值。
解决方法
只要把其中一个整数字面量改为浮点数,就能让C++执行浮点数除法,无论加不加括号结果都正确:
temperature_celsius = (temperature_farenheit - 32) * (5.0 / 9); // 或者写成5/9.0、(double)5/9都可以
内容的提问来源于stack exchange,提问作者dqproengineering
相关产品推荐
相关产品推荐

