C 宏中的意外结果

C 宏中的意外结果,c,macros,c-preprocessor,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); }

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

因此,应避免在宏中使用具有副作用的表达式。

更糟糕的是,缺少括号。CUBE1+2?使用一个内联函数来实现这类功能。inline int CUBEint x{return x*x*x;}那为什么不是6*6*6216呢?我知道它写得很糟糕,不是我的代码,我只是想理解它的行为。@mungostrap,因为它是未定义的行为。在这行代码中,任何事情都可能发生。因为定义的宏通过文本替换进行扩展。x*x*x中的每个令牌x都被实际的参数字符串++x替换,从而生成++x*++x。如果您使用的是unix,请尝试使用gcc-E myprog.cpc之类的命令查看预处理器输出@mungpstrap的可能重复项如果您仍然无法从其他答案/注释中理解问题,请检查gcc-E您的source.c的输出。这将运行预处理器来展开宏,并显示编译的实际源代码。。。也许到时候会更清楚些。@mah,好的,谢谢。尽管这里有一些很好的解释,但我还是会努力研究一下。尽管如此,这在将来还是有用的。