快捷搜索:  汽车  科技

c语言中define的用法:C语言中的宏陷阱

c语言中define的用法:C语言中的宏陷阱艾玛! 为嘛不是20*20的400呢?大家试试这样写:原因在于,宏定义的本质是文本替换!所以在预处理期间SQU(5 5)这段代码被宏替换为5 5*5 5 结果因为乘法优先级高于加法,变成5 25 5,可想而知!那么解决这个问题的办法,相信大家看完之后心里应该有答案了,就是给x加个小括号,使它变成一个整体,如下:正常写,不会触发陷阱,关键没错并不代表没有问题(虽然每个x都加了小括号!)

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

求两个或几个数的乘积: #define SQU(x) x*x

我们正常使用没有问题:

喜欢的话关注收藏评论转发一波 比心么么哒!加入我们C语言C 学习交流 壹 496926338群内有大量的项目开发和新手教学视频千人大群等着你来加入。

c语言中define的用法:C语言中的宏陷阱(1)

c语言中define的用法:C语言中的宏陷阱(2)

哎呀,竟然不是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的用法:C语言中的宏陷阱(3)

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

大家试试这样写:

c语言中define的用法:C语言中的宏陷阱(4)

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

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

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

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

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

c语言中define的用法:C语言中的宏陷阱(5)

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

喜欢的话关注收藏评论转发一波 比心么么哒!加入我们C语言C 学习交流 壹 496926338群内有大量的项目开发和新手教学视频千人大群等着你来加入。

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

猜您喜欢: