![](/img/trans.png)
[英]Chained compound assignments with C++17 sequencing are still undefined behaviour?
[英]Multiple compound assignments in a single statement: is it Undefined Behavior or not?
我無法找到明確的答案:以下代碼是否有未定義的行為?
int x = 2;
x+=x+=x+=2.5;
行為未定義。 讓我們看一下稍微簡單的表達式:
x += (x+=1)
在C ++ 11中,左x
的值計算相對於表達式的值計算(x+=1)
是未序列的。 這意味着x
值計算相對於x
的賦值是無序的(由於x+=1
),因此行為是未定義的。
這樣做的原因是+=
運算符的兩邊的值計算相對於彼此是無序的(因為標准沒有另外指定)。 並且1.9p15州:
如果對標量對象的副作用相對於同一標量對象的另一個副作用或使用相同標量對象的值進行的值計算未被排序,則行為未定義。
在C ++ 03中,行為未定義,因為x
被修改兩次而沒有插入序列點。
對於標准報價,請參閱其他答案。 在這種情況下,它可能會找到兩種不同的行為之一。
x += (x += 2);
可能是
x = 2 + 4 (= 6)
如果在x+=2
或之前評估左側x的值
x = 4 + 4 (= 8)
如果之后確定左操作符的x值。
我知道如果我說我不喜歡那些“任何可能發生的事情”的話,我就不會得到很多粉絲。 確實,無論我們在這里討論的語句如何處理x的值,任何編譯器都可以聲明自己的標准符合。 盡管如此,我認為這並不意味着operator + =可能會導致錯誤的結果,或者可能會忽略parantheses。 未定義的行為與任何其他情況下的未定義行為不同。
回到對未定義行為的任何期望是不好的,但在上面的例子中,我看到了忽略任何可能結果但6和8的充分理由。
另外我實際上懷疑在評估int x=2; x += (x += 2);
之后x為8 int x=2; x += (x += 2);
int x=2; x += (x += 2);
對於大多數已建立的編譯器(clang,g ++,vc,icpc ......)。
再說一遍,你不應該依賴這種行為,但這並不意味着它完全不可預測。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.