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

C语言自定义square宏未输出预期结果问题求解

问题原因

C语言的宏是纯文本替换,不会先对宏的内容做运算优先级处理,完全按照你定义的文本规则替换到代码里再编译。
你定义的宏:

#define square(x) x*x

当代码里的36/square(6)展开时,会直接替换为:

36/6*6

C语言中乘除运算优先级相同,按照从左到右的顺序计算:先算36/6=6,再算6*6=36,最终输出就是36,和你预期的36/(6*6)=1不符。

修复方法

定义带运算的宏时,必须给每个参数加括号,同时给整个宏的运算结果加括号,避免优先级问题:

#define square(x) ((x)*(x))

这样展开后表达式就变成36/((6)*(6)),运算结果就是你预期的1。

额外注意

宏的纯文本替换特性会带来很多隐性问题,比如传入带副作用的参数时:

int i = 2;
int res = square(i++);

展开后会变成int res = ((i++)*(i++));,会导致i被自增两次,结果不符合预期。这种场景更推荐用普通函数实现,避免宏的副作用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:54:04