2014-03-25 84 views
0

我有一個簡單的程序來計算立方體的體積。它運行良好,但我得到的結果是錯誤的。它出現爲「Y是392」。任何人都可以幫助我理解爲什麼它是392?我剛剛開始C,所以我不明白所有的代碼。宏中的意外結果

我意識到這個宏寫得很糟糕,我只是想在重寫它之前瞭解它的行爲。

#define CUBE(x) (x*x*x) 

void main(void); 

void main(void){ 
    int x, y; 
    x = 5; 
    y = CUBE(++x); 
    printf("Y is %d \n", y); 
} 
+0

[Undefined behavior or false positive]的可能重複(http://stackoverflow.com/questions/4129239/undefined-behavior-or-false-positive) –

+1

@mungpstrap如果您還不瞭解其他問題回答/評論,檢查'gcc -E your source.c'的輸出。這將運行預處理器(展開宏)並向您展示實際的源代碼將被編譯......或許它會更清晰。 – mah

+0

@mah, 好的,謝謝我會試着看看,雖然這裏有一些很好的解釋。這仍然可能在未來有用。 – mungostrap

回答

7

這是因爲宏展開:

y = ++x * ++x * ++x; 

這是一個非常糟糕的書面宏,出於這個原因;它看起來像一個函數調用(它只會評估一次參數),但它真的評估它三次。

由於缺少sequence points,因此給出了未定義的行爲。

+2

甚至更​​糟的是因爲缺乏括號。 'CUBE(1 + 2)'? – rodrigo

+0

我不認爲這是甚至定義的行爲... – computerfreaker

+2

對這種事情使用內聯函數。 'inline int CUBE(int x){return x * x * x; }' –

1

發生這種情況的原因是宏預處理器會按原樣替換參數。所以,CUBE(++x)被擴展爲:

++x*++x*++x 

您應該避免使用有副作用,因爲這個宏的表達式。