需求:求两个或几个数的乘积 #define SQU(x) x*x
我们正常使用没有问题
但如果这样写呢?
竟然,不是100了 难道SQU(10) 与SQU(5+5)不等价吗? 5+5不是10吗 确实 ,在这里SQU(10)和SQU(5+5)的确不等价!原因在于,宏定义的本质是:文本替换!所以在预处理期间SQU(5+5)这段代码被宏替换为 5+5*5+5 因为乘法优先级高于加法,所以答案是35
解决方法:就是给x加个小括号,使它变成一个整体
就可以解决了
当我们想算两个数的和的时候呢?我们继续验证:
欸,为什么不是20*20 = 400呢 。还是遵循宏的本质,我们展开来看:10+10*10+10=120又是一个优先级问题,又一个陷阱,防不胜防呀!
干脆整体加括号吧
这样写 #define ADD(x) ((x)+(x))