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

C++宏与inline函数调用差异:为何SQUARE(++a)输出6.25?

宏定义与inline函数的执行差异解析

核心原因:宏是文本替换,inline函数是参数传递

你看到的结果差异,本质是宏定义和inline函数的执行机制完全不同:

1. 宏定义SQUARE(++a)的执行逻辑

宏是预处理阶段直接做文本替换,不是函数调用。你的宏#define SQUARE(x) x*x遇到SQUARE(++a)时,会直接把所有x替换成++a,展开后的代码是:

c = ++a * ++a;

实际执行步骤:

  • 第一次++a:a从0.5变为1.5
  • 第二次++a:a从1.5变为2.5
  • 最后计算2.5 * 2.5 = 6.25,所以c的结果是6.25

2. inline函数square(++b)的执行逻辑

inline函数是真正的函数调用,执行时会先计算实参的值再传递:

  • 先执行++b:b从0.5变为1.5
  • 将1.5传递给函数形参y
  • 函数内部计算y*y = 1.5*1.5 = 2.25,所以d的结果是2.25

3. 如何避免宏的这类陷阱

如果一定要用宏实现平方计算,要给参数和整体加括号(避免运算符优先级问题),但即使这样,传入自增/自减表达式还是会有副作用:

#define SQUARE(x) ((x)*(x))

更推荐用inline函数或普通函数,从根源避免宏的文本替换带来的意外问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:22:13