C语言中的宏定义:#define的使用与括号的重要性
创作时间:
作者:
@小白创作中心
C语言中的宏定义:#define的使用与括号的重要性
引用
CSDN
1.
https://m.blog.csdn.net/weixin_55341642/article/details/141869946
何为宏
在C语言中,#define机制允许将参数替换到文本中,这种实现通常被称为宏。宏是一种预处理指令,可以在编译之前对代码进行文本替换,从而实现代码的复用和简化。
宏的声明及其使用方式
声明代码演示
#define MAX(x,y) ((x)>(y)?(x):(y))
使用代码演示
int a = 3;
int b = 5;
int max = MAX(a, b);
代码解析
在程序预处理阶段,MAX(a, b)会被替换为:
int max = ((a)>(b)?(a):(b));
宏中的括号是否多余
提问
在宏定义中,为什么每个变量都加上了括号?这些括号是否可以去掉?
代码演示
不加括号的宏定义:
#define MUL(x,y) x * y
加上括号的宏定义:
#define MUL(x,y) ((x) * (y))
使用代码演示
int a = 3;
int b = 5;
int sum = MUL(a + b, b - a);
代码解析
预期结果是计算a + b的和与b - a的差的乘积,即8 * 2 = 16。
不加括号代码验证
如果不加括号,宏展开后会变成:
int sum = a + b * b - a;
这会导致优先级问题,计算结果不符合预期。
加上括号代码验证
加上括号后,宏展开为:
int sum = ((a + b) * (b - a));
这样就能正确计算出预期的结果。
结论
从代码验证中可以看出,不加括号的结果与预期结果大相径庭。出现这一问题的原因有两点:
- 宏是完完全全的替换,替换前并不会进行计算,所以是直接将
a + b和b - a替换到宏中,这样就会出现优先级的先后问题。 - 宏中的变量不一定是简单的变量,有可能是表达式,也有可能是函数等。
因此,在声明宏的时候,最好加上必要的括号,以免出现优先级问题。
热门推荐
北风吹,痛风到!关于痛风治疗的这些真相你必须知道
公司治理中的股东会、董事会、理事会:角色与职责区分
2024年上海市GDP达53927亿元,同比增长5%
培育特色经典诵读成果 助力学校文化内涵提升
3/3周一足球赛事分析:尤文往绩占优,维罗纳客场不佳!
年轻人的Chiikawa狂热:从表情包到“整形手术”
30年,1000万辆:比亚迪是怎么“卷”出一家世界级新能源车企的?
如何正确制备样品稀释液?
荆州十大景点之松滋:“山水相映、人文荟萃”
揭秘中国航母:从辽宁舰到福建舰,舰上工作人员如何分工?
兄妹分摊赡养父母费用协议模板
预付账款:探究其资产属性及对企业运营的影响
咖啡的奇妙之旅:拿铁与卡布奇诺的魅力,卡美罗的甜蜜邂逅
2024护网行动已经开始,带您认识护网行动
诸葛亮:三大品质塑造的人文典范
武则天的四个儿子,李弘,李贤,李显,李旦分别是何结局?
和患肺结核的人擦身而过,就会感染肺结核么?
道家的“法自然”怎么理解?道家思想有什么教化蕴意?
如何治疗胃强脾弱导致饥饿时腹痛的症状
PMP证书的价值与备考指南
不仅橘子可以吃,他的皮也可以吃?你知道皮都有哪些功效吗?
知识产权维护是什么?如何有效保护你的无形资产
漏电检测以及漏电原因介绍
宝宝发热不退有没有好办法?
肺结核传染期是什么
选择马拉松的人,都在选择什么样的人生
天量募资?造富神话?是什么造就了对冲基金的“反脆弱”魅力
重磅!最全!中国种企20强、农作物10大品种名单发布
古代皇帝都是男人 武则天是怎么解决合法性的
如何用代码写出机器人三大法则