宏中的意外结果
我有一个简单的程序来计算立方体的体积。 它运行良好,但我得到的结果是错误的。 它的出现是“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
因此,您应该避免在宏中使用带副作用的表达式。