2011-05-30 22 views
1

有人可以解釋爲什麼b = 150?C++預處理器中的前綴增量

#define CUBE(X) ((X) * (X) * (X)) 

using namespace std; 

int main(void) 
{ 
    int a = 3,b = 0; 

    cout << "before "<< endl; 
    cout << "a = " << a; 
    cout << endl; 
    cout << "b = " << b; 
    cout << endl; 
    cout << "after"<< endl; 
    b = CUBE(++a); 
    cout << "a = " << a; 
    cout << endl; 
    cout << "b = " << b; 
    getchar(); 
    return 0; 
} 
+0

[C,C++預處理器宏]的可能的重複(http://stackoverflow.com/questions/1263607/cc-preprocessor-macro) – 2011-05-30 19:40:56

+0

@BoPersson:相關,但不是重複...不僅僅是因爲那個在序列點之間通過遞增多次不具有UB特徵。 – 2011-05-30 21:14:13

回答

10

因爲您正在使用宏。宏不是功能。

行:你的代碼編譯之前

b = ((++a) * (++a) * (++a)) 

b = CUBE(++a); 

被重新寫成。

The code then invokes Undefined Behaviour因爲您在序列點之間增加了幾次a

如果你使用函數,會更好。

+0

是的,我知道內聯函數更好,但我只需要這個問題的答案;)我瞭解情況,如果我有b = CUBE(a ++); – wolf3d 2011-05-30 19:40:41

+2

@ wolf3d:情況與'++ a'相同,與'a ++'相同。任何改變和讀取序列點之間的'a'的操作集合都是未定義的。 – 2011-05-30 19:42:28

+1

@ wol3d:As Tomalak Geret'kal用'a ++'表示行爲沒有定義。也許你理解編譯器生成的代碼,但這並不意味着每個編譯器都會這樣做,或者同一編譯器的其他版本也會這樣做。 – Benoit 2011-05-30 19:49:26

3

未定義的行爲 - 在序列點之間多次修改a。這就是爲什麼inline函數是非常優越的選擇。