首页 > 解决方案 > C++11什么时候做相对于运算符优先级的算术类型转换?

问题描述

如果我有以下代码:

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)中是否发生了变化?

标签: c++c++11floating-pointtype-conversioninteger-overflow

解决方案


表达方式

val1 + val2 * val3 * val4

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

val1 + (val2 * val3 * val4)

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

要使乘法发生,double您需要将其中一个val2val3一个 double 类型转换为 double,这将使整个乘法部分评估为double. 那看起来像

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

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


推荐阅读