[英]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.