該宏命名錯誤,但這只是一個紅鯡魚。這兩個語句展開爲:
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 -O4
與cc
有什麼不同?實際上,引用Internet Jargon文件:
nasal demons是什麼意思
對於遇到未定義構造的C編譯器的任何意外行爲,Usenet組comp.std.c被識別爲速記。在1992年初討論這個小組的時候,經常提到「當編譯器遇到[一個給定的未定義的構造]時,讓惡魔飛出你的鼻子是合法的」(這意味着編譯器可以任意選擇任何奇怪的在不違反ANSI C標準的情況下解釋代碼的方式)。其他人隨後提到了「鼻子惡魔」,後來很快成立。原文可在http://groups.google.com/groups?hl=en&selm=10195%40ksr.com網站上獲得。
所以,我會在這裏更加小心。你想惡魔從你的鼻子裏飛出嗎?
你的平方函數必須是(x * x),你定義了一個立方體函數 – Memolition
當你有未定義的行爲時,任何輸出都是同樣有效的,並且沒有任何真正的「解釋」它。因此,即使/如果你「修復」了你的「SQUARE」宏,使它變成了正方形而不是立方體,你的結果仍然基本沒有意義。 –
你說**未定義的行爲**在自己的評論中,那麼解釋是什麼? –