2011-05-30 61 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函数是非常优越的选择。