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

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

本文关键字:类型转换 优先级 何时 相对于 运算符 C++11      更新时间:2023-10-16

如果我有以下代码:

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)

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