如果我有以下代码:
double compute(double val1,
int32_t val2,
int32_t val3,
int32_t val4) {
return val1 + val2 * val3 * val4;
}
C++11 语言如何指定执行乘法?例如,根据运算符优先级,val1
、val2
和 val3
乘以 32 位整数,可能会溢出,然后转换为 double ,或者它们乘以 double ?
一般来说,该标准在这个主题上到底说了些什么?它在 C++ 的后续版本(例如 C++17)中是否发生了变化?
最佳答案
表达式
val1 + val2 * val3 * val4
的类型为double
,但乘法部分的类型为int32_t
。如果我们应用评估规则,我们就会得到
val1 + (val2 * val3 * val4)
由于乘法具有更高的优先级,因此将在不考虑 val1 的类型的情况下对其进行求值,并且由于所有操作数都具有相同的类型,因此结果类型将与操作数相同。然后将该结果转换为 double
并添加到 val1
。此行为在任何 C++ 版本中都没有改变。
要使乘法发生为 double
,您需要将 val2
或 val3
转换为 double,这将使整个乘法部分评估为double
。这看起来像
val1 + (static_cast<double>(val2) * val3 * val4)
不需要括号,但我喜欢用它们来显示分组
关于c++ - C++11 何时进行相对于运算符优先级的算术类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54119126/