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
相关产品推荐
相关产品推荐

