zoukankan      html  css  js  c++  java
  • [C]宏陷阱

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(www.zengqiang.org
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/11419042.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    求两个或几个数的乘积:   #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

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

  • 相关阅读:
    Using Change Management and Change Control Within a Project
    swift3.0 label改变行间距
    swift清理缓存
    Alamofire的get请求,post请求,以及上传字典
    swift跳转时隐藏tabbar,跳回时显示
    swift获取当前的Version
    swift回收键盘
    OC中常用的设计模式
    关于iOS多线程
    理解 : UDID、UUID、IDFA、IDFV
  • 原文地址:https://www.cnblogs.com/strengthen/p/11419042.html
Copyright © 2011-2022 走看看