C语言宏SQUARE(X)传入++x后结果为49的原因解析
为什么调用宏SQUARE(++x)会得到49?
先看你的代码:
#include <stdio.h> #define SQUARE(X) X * X #define PR(X) printf("The result is %d.\n", X) int main(void) { int x = 5; printf("x = %d\n", x); PR(SQUARE(++x)); // 输出49 return 0; }
核心原因:宏是文本替换,不是函数调用
C语言的宏定义是纯文本替换,不会像函数那样先计算参数的值再传递。当你调用SQUARE(++x)时,预处理器会直接把宏里的X替换成++x,所以宏展开后的代码是:
PR(++x * ++x)
再展开PR宏,最终变成:
printf("The result is %d.\n", ++x * ++x);
表达式++x * ++x的执行过程
x初始值是5,这个表达式里++x出现了两次:
- 编译器在计算乘法前,会先对两个操作数进行求值(注:这种写法属于C语言的未定义行为,不同编译器求值顺序可能不同,但你的环境里是按以下逻辑执行的)。
- 第一次
++x把x从5变成6,第二次++x把x从6变成7。 - 最后计算7*7,结果就是49。
和函数的区别对比
如果把SQUARE改成函数:
int square(int x) { return x * x; }
调用square(++x)时,++x只会执行一次,x变成6,然后计算6*6=36——这就是宏和函数最关键的区别之一:宏的参数会被多次求值,而函数参数只会求值一次。
内容的提问来源于stack exchange,提问作者amed svensson
相关产品推荐
相关产品推荐

