[英]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语言如何指定执行乘法? 例如, val1
, val2
和val3
根据运算符优先级乘以32位整数,可能会溢出,然后转换为双精度数,或者将它们乘以双精度数?
通常,该标准在该主题上到底怎么说? 在后续的C ++版本(例如C ++ 17)中是否进行了更改?
表达方式
val1 + val2 * val3 * val4
具有double
类型,但乘法部分为int32_t
类型。 如果我们对评估方法应用规则,我们有
val1 + (val2 * val3 * val4)
因为乘法具有更高的优先级,所以将在不考虑val1
的类型的情况下对其进行评估,并且由于所有操作数都具有相同的类型,因此结果类型将与操作数相同。 然后将该结果转换为double
并将其添加到val1
。 在任何C ++版本中,此行为均未更改。
为了使乘法发生为double
您需要将val2
或val3
转换为double,这会将整个乘法部分评估为double
。 看起来像
val1 + (static_cast<double>(val2) * val3 * val4)
不需要括号,但是我喜欢用它们来显示分组
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.