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

求两个或几个数的乘积: #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语言的宏定义陷阱(#define SQU(x) ((x)+(x)))相关推荐

  1. 小白来学C语言之宏定义(#define)

    毕竟是小白,从小白视角看可能不会太深,但应该都能看懂. 这篇博客就是也是写给新手的,希望大家都能学懂学好,嘿嘿,写的不好还望大佬勿喷. 可以使用#define 伪指令来定义一个宏. 宏分为不带参数的宏 ...

  2. c语言中宏定义的字符替换#define M(x,y,z) x*y+z

    C语言中宏定义的字符替换问题 例子: 在c语言中定义如下宏 #define M(x,y,z) x*y+z 给定如下程序 #include<stdio.h> #include<stdl ...

  3. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  4. c语言用宏定义常量_使用宏定义常量以在C的数组声明中使用

    c语言用宏定义常量 As we know that, while declaring an array we need to pass maximum number of elements, for ...

  5. C/C++编程笔记:浅析 C 语言中宏定义的使用,知识点全解

    宏定义是用一个标识符来表示一个字符串,在宏调用中将用该字符串代替宏名.给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率,对于嵌入式系统而言,为了能达到性能要求,宏是一种很 ...

  6. C语言中宏定义和函数的取舍

    要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...

  7. 你真的了解宏吗:浅谈宏定义(#define语句)

    简单聊下宏呗 写在前面: 宏定义 语法 1. 宏的作用范围 2.宏替换的原则 4. 宏函数申明 5. 宏中的 "#" 和 "##" #的用法 ##的用法 6. ...

  8. C语言-入门-宏定义(十七)

    预处理 编译一个C语言程序的第一步骤就是预处理阶段,这一阶段就是宏发挥作用的阶段.C预处理器在源代码编译之前对其进行一些文本性质的操作,主要任务包括删除注释.插入被#include进来的文件内容.定义 ...

  9. C语言中宏定义的使用

    1. 引言 1.1 宏定义的基本语法 1.2 宏定义的优点 1.3 宏定义的缺点 1.4 宏还是函数 2 使用宏时的注意点 2.1 算符优先级问题 2.2 分号吞噬问题 2.3 宏参数重复调用 2.4 ...

最新文章

  1. java右移位_java、、移位操作方法
  2. 在Linux程序中输出函数调用栈
  3. hdu 4925 Apple Tree--2014 Multi-University Training Contest 6
  4. 前端学习(2368):编程式导航
  5. linux fb应用例子,Linux下利用framebuffer画点的程序小例子
  6. Backtrader多周期回测
  7. 那些大学简称背后的“爱恨情仇”:东西南北中,就剩北大没人抢了
  8. 《项目百态:软件项目管理面面观》三模式总结
  9. paramiko上传下载
  10. 获取 Transaction Source
  11. html5的web存储详解
  12. 大访问量网站缓存的一点思考,个人看法,勿拍砖
  13. HDU3782 xxx定律【数学计算+水题】
  14. 学习 尚硅谷_宋红康_第2章_Java基本语法(下):程序流程控制超详细课件
  15. ie11只能用管理员身份打开解决办法
  16. ae合成复制脚本_【脚本】AE脚本精选系列 | 合成复制脚本 True Comp Duplicator v3.9.7...
  17. 【翻译】PDF格式详解
  18. RK3399外设驱动之PWM驱动:红外驱动
  19. java中intern,在Java中什么时候使用String.intern()方法?
  20. 【HNOI 2018】寻宝游戏

热门文章

  1. 使用requests爬取豆瓣电影top250
  2. 知识蒸馏DEiT算法实战:使用RegNet蒸馏DEiT模型
  3. 2022第十一届中国创新创业大赛全国总决赛在深圳举办
  4. 学 SQL 必须了解的10个高级概念
  5. 通过1个IP地址同时采集2台西门子S7200 Smart的数据
  6. Thymeleaf 自定义标签
  7. iOS - IM 即时通讯
  8. PayPal创始人:北京创业氛围仅次于硅谷
  9. 判断数组里面的对象是否相同与不相同
  10. Windows 桌面系统图标显示或隐藏