繁体   English   中英

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,这会将整个乘法部分评估为double 看起来像

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM