关于宏定义的注意点

求两个或几个数的乘积: #define SQU(x) x*x 我们正常使用没有问题: C语言中的宏陷阱 #define SQU(x) x*x 但如果这样写呢? C语言中的宏陷阱 #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,结果因为乘法优先级高于加法,变成5+25+5,可想而知! 那么解决这个问题的办法,相信大家看完之后心里应该有答案了,就是给x加个小括号,使它变成一个整体,如下: C语言中的宏陷阱 #define SQU(x) x*x 就可以解决了。 然而,这并不没有完! 与此类似的,当我们想算两个数的和的时候呢?我们继续验证: C语言中的宏陷阱 #define SQU(x) x*x 正常写,不会触发陷阱,关键没错并不代表没有问题(虽然每个x都加了小括号!) 大家试试这样写: C语言中的宏陷阱 #define SQU(x) x*x 艾玛! 为嘛不是20*20的400呢? 还是遵循宏的本质,我们展开来看:10+10*10+10=120 又是一个优先级问题,又一个陷阱,防不胜防呀! 那怎么解决呢?答:干脆一了百了,整体全加括号吧! 这么写:#define ADD(x) ((x)+(x)) C语言中的宏陷阱 #define SQU(x) x*x


总结 ,宏定义的本质就是文本替换,并不能进行优先级的自行排序。所以最保险的方法就是加上括号,强制的体现出运算的优先级。防止出现错误。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值