C++预处理器中的前缀增量

wol*_*f3d 1 c++ increment prefix c-preprocessor

有人可以解释为什么b = 150?

#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;
}
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 10

因为你正在使用宏.宏不是函数.

这条线:

b = CUBE( ++a );
Run Code Online (Sandbox Code Playgroud)

被重写为:

b = ((++a) * (++a) * (++a))
Run Code Online (Sandbox Code Playgroud)

在您的代码编译之前.

然后代码调用Undefined Behavior,因为您a在序列点之间增加了几次.

如果你使用一个函数会更好.

  • @ wolf3d:`++ a`与`a ++`的情况相同.在序列点之间改变和读取"a"的任何操作集合都是未定义的. (2认同)