宏中的意外结果

我有一个简单的程序来计算立方体的体积。 它运行良好,但我得到的结果是错误的。 它的出现是“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); } 

这是因为宏扩展到:

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

由于这个原因,这是一个写得非常糟糕的宏; 它看起来像一个函数调用(它只会对参数进行一次评估),但它实际上会对它进行三次评估。

这给出了未定义的行为,因为缺少序列点 。

发生这种情况的原因是宏预处理器按原样替换参数。 因此, CUBE(++x)扩展为:

 ++x*++x*++x 

因此,您应该避免在宏中使用带副作用的表达式。