我有一个简单的程序来计算立方体的体积。它运行良好,但我得到的结果是错误的。它出现在" 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);
}
答案 0 :(得分:6)
这是因为宏扩展为:
y = ++x * ++x * ++x;
由于这个原因,这是一个写得非常糟糕的宏;它看起来像一个函数调用(它只会对参数进行一次评估),但它实际上会对它进行三次评估。
这会导致未定义的行为,因为缺少sequence points。
答案 1 :(得分:0)
发生这种情况的原因是宏预处理器按原样替换参数。因此,CUBE(++x)
扩展为:
++x*++x*++x
因此,您应该避免在宏中使用带副作用的表达式。