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语言是如何指定进行乘法运算的?例如,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
.看起来像
val1 + (static_cast<double>(val2) * val3 * val4)
不需要括号,但我喜欢用它们来显示分组
如果我有以下代码:
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
.看起来像
val1 + (static_cast<double>(val2) * val3 * val4)
不需要括号,但我喜欢用它们来显示分组