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

