前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言中的宏陷阱 #define SQU(x) x*x

C语言中的宏陷阱 #define SQU(x) x*x

作者头像
编程范 源代码公司
发布2018-04-18 16:16:38
1.3K0
发布2018-04-18 16:16:38
举报

有同学写过或者想写这样的宏定义吗?

求两个或几个数的乘积: #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加个小括号,使它变成一个整体,如下:

就可以解决了。

然而,这并不没有完!

与此类似的,当我们想算两个数的和的时候呢?我们继续验证:

正常写,不会触发陷阱,关键没错并不代表没有问题(虽然每个x都加了小括号!)

大家试试这样写:

艾玛! 为嘛不是20*20的400呢?

还是遵循宏的本质,我们展开来看:10+10*10+10=120

又是一个优先级问题,又一个陷阱,防不胜防呀!

那怎么解决呢?答:干脆一了百了,整体全加括号吧!

这么写:#define ADD(x) ((x)+(x))

怎么样,这样写就没问题了!你的宏,从此百毒不侵!

有什么学习中遇到的问题,请联系我们!

C语言研究中心(www.dotcpp.com)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程范 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档