2011-01-08 36 views
0

再一次,一個愚蠢的問題。後綴增量是否在返回值上執行增量?

#include <stdio.h> 
#include <iostream> 
using namespace std; 

int main() 
{ 
int i = 0; 
i = i++; 
cout<<i; 

return 0; 
} 

我得到1打印了作爲該程序雖然我預期0的結果:第一創建eing等於0的臨時對象,則i遞增,然後臨時對象返回並分配至i。只是根據:

5.2.6遞增和遞減[expr.post.incr] 1所述的通過施加一個後綴++得到 值是值 該操作數施加 操作過的。 [注意:得到的值 是原始 值的副本]

我檢查下MS VC 2008和GCC。他們給出了相同的結果,但至少gcc在增量字符串中發出警告。我錯在哪裏?

回答

0

i = i++; 

行爲是不確定的。如果一個表達式將一個變量賦予兩個不同的值,那麼C++規範說任何事情都可能發生 - 它可能會發生其舊值,兩個新值之一或幾乎任何東西。原因是它允許編譯器對簡單表達式進行更積極的優化。例如,編譯器可以重新排列賦值和執行的順序,如果它認爲它更有效。

+0

您能否提供一個標準的證明鏈接,爲什麼它是未定義的?我猜到了,但沒有找到證據。只有GCC在'-Wall'模式下提供警告。 – flashnik

+0

即使沒有優化和調試模式,結果也是一樣的。 – flashnik

+3

http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points/4176333#4176333 – ybungalobill