什麼是工作的方式進行:很常見的表達式求值
int i=5;
a= ++i + ++i + ++i;
如果我們去了左評價正常嗎,結果應爲21(6 + 7 + 8)。
我記得在學校學習,那答案是24(8 + 8 + 8)
但我想它的代碼塊,www.ideone.com,即GCC 4.8.1編譯器和現在我得到22 有人可以解釋原因
什麼是工作的方式進行:很常見的表達式求值
int i=5;
a= ++i + ++i + ++i;
如果我們去了左評價正常嗎,結果應爲21(6 + 7 + 8)。
我記得在學校學習,那答案是24(8 + 8 + 8)
但我想它的代碼塊,www.ideone.com,即GCC 4.8.1編譯器和現在我得到22 有人可以解釋原因
該表達式中沒有Sequence Points,所以你不能解決它,它是未定義的/依賴於編譯器。
它是作爲由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;
「未定義」非常不同「實現定義」。在這種情況下,它是未定義的。 – molbdnilo
@molbdnilo:由於編譯器編譯並且程序給出了結果**,所以它是**定義的。 –
@Kyle_the_hacker:沒有。未定義的後果之一是編譯器可以做任何事情,包括編譯它並給出結果。事實上,對於未定義的行爲,幾乎總是這樣做的,因爲它是最簡單的事情(不需要特殊情況) –
沒有工作它的方式。 –
另請參見:http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points –
來自其中一個問題的很好的引用,這是一個可能的重複: 「使用語言的語言標準實際上告訴你他們會做什麼,不要使用未定義的行爲,然後想知道發生了什麼。「 –