2013-08-04 89 views
-2

請解釋下面的代碼輸出:你能解釋下面的輸出嗎?

#include<stdio.h> 
#include<stdlib.h> 

#define SQUARE(x) (x*x*x) 

int main() { 
    int x = 3; 
    int y = SQUARE(++x)/x++; // Undefined behavior even though it doesn't look 
         // like it here 
    printf("%d %d",x,y); 
    return 0; 
} 

輸出:7月25日

請解釋y的值如何來爲25?

+0

你的平方函數必須是(x * x),你定義了一個立方體函數 – Memolition

+4

當你有未定義的行爲時,任何輸出都是同樣有效的,並且沒有任何真正的「解釋」它。因此,即使/如果你「修復」了你的「SQUARE」宏,使它變成了正方形而不是立方體,你的結果仍然基本沒有意義。 –

+1

你說**未定義的行爲**在自己的評論中,那麼解釋是什麼? –

回答

0

該宏命名錯誤,但這只是一個紅鯡魚。這兩個語句展開爲:

int x = 3; 
int y = (++x * ++x * ++x)/x++; 

這是未定義的行爲,因爲x在序列點之間不止一次被修改。編譯器可以做任何事情;它可以交叉使用x以及幾乎任何它想要的前後增量x。它可以做的事情由左到右,在這種情況下,您可以:

int y = (4 * 5 * 6)/6; 

在此計劃下,x現在是7和y現在是20

它可以做正確的事情,以 - 左:現在

int y = (7 * 6 * 5)/3; 

y是70

它可能是緩存的x在幾乎任何一個點的價值d使用它。嘗試在各種編譯器下運行您的程序,並提供各種優化級別。 gcc -O4cc有什麼不同?實際上,引用Internet Jargon文件:

nasal demons是什麼意思

對於遇到未定義構造的C編譯器的任何意外行爲,Usenet組comp.std.c被識別爲速記。在1992年初討論這個小組的時候,經常提到「當編譯器遇到[一個給定的未定義的構造]時,讓惡魔飛出你的鼻子是合法的」(這意味着編譯器可以任意選擇任何奇怪的在不違反ANSI C標準的情況下解釋代碼的方式)。其他人隨後提到了「鼻子惡魔」,後來很快成立。原文可在http://groups.google.com/groups?hl=en&selm=10195%40ksr.com網站上獲得。

所以,我會在這裏更加小心。你想惡魔從你的鼻子裏飛出嗎?

+0

宏擴展也加了括號,它是'int y =(++ x * ++ x * ++ x)/ x ++;' – user2485710

+0

True。我會編輯。 –

相關問題