为何C语言#define宏表达式在输入逻辑等价时返回不同结果?
为何C语言#define宏表达式在输入逻辑等价时返回不同结果?
嘿,这个问题刚好踩中了C语言宏定义最容易掉的坑——宏是纯粹的文本替换,不是真正的函数调用!咱们一步步拆解你遇到的问题:
首先看你定义的宏:
#define MULTIPLY(x, y) x * y + 2
当你调用MULTIPLY(6 - 1, 4)的时候,宏不会先计算6-1的值再代入,而是直接把代码里的x替换成6-1,y替换成4,展开后的代码其实是:
int result = 6 - 1 * 4 + 2;
而C语言里运算符优先级是乘法高于加减,所以会先算1*4=4,然后依次计算6-4=2、2+2=4,结果自然就是4了。
但你调用MULTIPLY(5,4)的时候,展开后是5*4+2,乘法先算得到20,加2就是22,这和你预期的一致。
要解决这个问题,关键是给宏里的每个参数以及整个表达式都加上括号,避免优先级带来的意外:
#define MULTIPLY(x, y) ((x) * (y) + 2)
这样再调用MULTIPLY(6-1,4)时,展开后会变成((6-1)*(4)+2),括号会强制先计算6-1和4的乘法,最后加2,结果就是你想要的22了。
顺便提一句,宏的文本替换特性除了优先级问题,还可能带来副作用(比如参数是i++的话,展开后可能会执行多次自增),如果你的场景不需要宏的特殊特性,用inline函数替代宏会更安全哦。
备注:内容来源于stack exchange,提问作者Kevin Chen
相关产品推荐
相关产品推荐

