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

标签 c++ c++11 floating-point type-conversion integer-overflow

如果我有以下代码:

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

C++11 语言如何指定执行乘法?例如,根据运算符优先级,val1val2val3 乘以 32 位整数,可能会溢出,然后转换为 double ,或者它们乘以 double ?

一般来说,该标准在这个主题上到底说了些什么?它在 C++ 的后续版本(例如 C++17)中是否发生了变化?

最佳答案

表达式

val1 + val2 * val3 * val4

的类型为double,但乘法部分的类型为int32_t。如果我们应用评估规则,我们就会得到

val1 + (val2 * val3 * val4)

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

要使乘法发生为 double,您需要将 val2val3 转换为 double,这将使整个乘法部分评估为double。这看起来像

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

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

关于c++ - C++11 何时进行相对于运算符优先级的算术类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54119126/

相关文章:

C++ - 循环中的 unordered_map - 执行哈希运算符()

objective-c - CS193P - 向 iOS 计算器添加浮点按钮

math - float 学有问题吗?

c++ - 轨道菜单弹出 : popup menu keeps disappearing

c++ - 如何找到风力涡轮机叶片相对于水平假想轴形成的角度?

在参数中强制执行单一类型的 C++ 参数包

c++ - 使用迭代器执行对象操作的函数

在C中将2字节或3字节转换为 float

c++ - 传递对输出位置的引用与使用返回

c++ - 我很困惑为什么在 C++ 中返回构造函数是合法的