簡體   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