【发布时间】:2019-01-09 22:10:51
【问题描述】:
如果我有以下代码:
double compute(double val1,
int32_t val2,
int32_t val3,
int32_t val4) {
return val1 + val2 * val3 * val4;
}
C++11 语言如何指定执行乘法?例如,val1、val2 和 val3 是否根据运算符优先级乘以 32 位整数,可能溢出,然后转换为双精度数,还是将它们相乘为双精度数?
一般来说,该标准在这个主题上到底说了些什么?它在 C++ 的后续版本(例如 C++17)中是否发生了变化?
【问题讨论】:
-
运算符优先级意味着在这种情况下,乘法发生在加法之前。表达式
val2*val3*val4计算为int32_t- 也有溢出的任何影响。然后将其结果转换为double,然后再添加到val1。 C++11 之前的所有 C++ 版本都具有相同的功能。固定宽度类型,如int32_t,在 C++11 之前不是标准的。 -
您首先使用的是双精度值,因此当它们影响双精度值时,所有期望的结果都会变成双精度值,并且会发生转化。从左到右
val1+((val2*val3)*val4)
标签: c++ c++11 floating-point type-conversion integer-overflow