宏中的意外结果

时间:2014-03-25 16:10:15

标签: c macros c-preprocessor

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

2 个答案:

答案 0 :(得分:6)

这是因为宏扩展为:

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

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

这会导致未定义的行为,因为缺少sequence points

答案 1 :(得分:0)

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

++x*++x*++x

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