You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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出现了两次:

  1. 编译器在计算乘法前,会先对两个操作数进行求值(注:这种写法属于C语言的未定义行为,不同编译器求值顺序可能不同,但你的环境里是按以下逻辑执行的)。
  2. 第一次++x把x从5变成6,第二次++x把x从6变成7。
  3. 最后计算7*7,结果就是49。

和函数的区别对比

如果把SQUARE改成函数:

int square(int x) {
    return x * x;
}

调用square(++x)时,++x只会执行一次,x变成6,然后计算6*6=36——这就是宏和函数最关键的区别之一:宏的参数会被多次求值,而函数参数只会求值一次。

内容的提问来源于stack exchange,提问作者amed svensson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:39:19