2013-08-05 52 views
-1

什麼是工作的方式進行:很常見的表達式求值

int i=5; 
a= ++i + ++i + ++i; 

如果我們去了左評價正常嗎,結果應爲21(6 + 7 + 8)。

我記得在學校學習,那答案是24(8 + 8 + 8)

但我想它的代碼塊,www.ideone.com,即GCC 4.8.1編譯器和現在我得到22 有人可以解釋原因

+0

沒有工作它的方式。 –

+0

另請參見:http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points –

+3

來自其中一個問題的很好的引用,這是一個可能的重複: 「使用語言的語言標準實際上告訴你他們會做什麼,不要使用未定義的行爲,然後想知道發生了什麼。「 –

回答

0

該表達式中沒有Sequence Points,所以你不能解決它,它是未定義的/依賴於編譯器。

0

它是作爲由C/C++標準的undefined or implementation-defined behavior限定。語言標準不要求指定行爲,它允許編譯器實現選擇(通常是文檔)。

也期待在另一個StackOverflow的問題:Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)


GCC做你的榜樣是什麼如下:

int i = 5; 
a = ++i + (++i + ++i); // it first gets the value of i and increments it two times 
a = ++i + (7 + 7); // it then reads the new value of i, does the addition and save it as a constant in the stack 
a = ++i + 14; // it then gets the value of i and increments it 
a = 8 + 14; // it then reads the new value of i and add it to the constant 
a = 22; 
+0

「未定義」非常不同「實現定義」。在這種情況下,它是未定義的。 – molbdnilo

+0

@molbdnilo:由於編譯器編譯並且程序給出了結果**,所以它是**定義的。 –

+0

@Kyle_the_hacker:沒有。未定義的後果之一是編譯器可以做任何事情,包括編譯它並給出結果。事實上,對於未定義的行爲,幾乎總是這樣做的,因爲它是最簡單的事情(不需要特殊情況) –