簡體   English   中英

單個語句中的多個復合賦值:是否為未定義行為?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM