C++11 何时进行算术类型转换(相对于运算符优先级)?

When does C++11 do arithmetic type conversions relative to operator precedence?

如果我有以下代码:

double compute(double val1,
               int32_t val2,
               int32_t val3,
               int32_t val4) {
  return val1 + val2 * val3 * val4;
}

C++11语言是如何指定进行乘法运算的?例如,val1val2val3 是按运算符优先级乘以 32 位整数,可能溢出,然后转换为双精度,还是乘以双精度?

总的来说,关于这个主题,标准到底是怎么说的?它在后续版本的 C++(例如 C++17)中是否发生了变化?

表达式

val1 + val2 * val3 * val4

的类型为double,但乘法部分的类型为int32_t。如果我们应用关于如何评估的规则,我们有

val1 + (val2 * val3 * val4)

因为乘法具有更高的优先级,所以将在不考虑 val1 的类型的情况下对其进行评估,并且由于所有操作数都具有相同的类型,因此结果类型将与操作数相同。然后将该结果转换为 double 并添加到 val1。此行为在任何 C++ 版本中都没有改变。

要使乘法发生 double,您需要将 val2val3 转换为双精度数,这将使整个乘法部分计算为 double.看起来像

val1 + (static_cast<double>(val2) * val3 * val4)

不需要括号,但我喜欢用它们来显示分组