用#define宏实现Add函数

简介: 用#define宏实现Add函数

我们知道#define宏是一种非常暴力的替换宏定义会在程序编译预处理阶段在调用宏的位置进行文本内容的直接替换,因此我们在使用宏定义实现Add加法函数时就要注意一些可能会报错的问题。  


首先亮出答案:

#define Add(x,y) ((x)+(y))


那这里可能会有两个疑惑? 1.为什么x和y参数单独要加上括号? 2. 为什么x+y整体要加上括号?

这里是为了解决两个可能出现的问题:1.表达式问题(大括号) 2.优先级问题(小括号)

表达式冲突:

#define ADD(x,y) x+y
int main()
{
  int x = 2;
  int y = 3;
  printf("%d\n", ADD(x,y)*3 ); //宏替换为2+3*3
}


结果:


62eeca6d7f63444e88a160e4cc06cf9a.png


分析:我们想得到的结果应该是(2+3)*3 =15,但为什么是11呢?这里是因为宏的直接替换导致表达式为 2+3*3 =11;所以为了解决此问题我们加上大括号

优先级问题:

#define ADD(x,y)  (x + y)
int main()
{
  int a = 2;
  int b = 3;
  printf("%d\n", ADD(a|b, a&b)); //宏替换为  2|3 + 2&3;算术运算符比逻辑运算符优先级高
}


结果


3937f9a377bf4b89ad35648549869b7f.png


分析:考虑到参数可能作为表达式中的一份子,而运算符具有优先级区别,这里"+" 算术运算符比逻辑运算符"|,&"优先级更高,宏直接替换为 2|3 + 2&3  =3;所以我们为每个参数加上括号解决优先级问题


宏函数的优缺点:


优点:直接暴力替换,不是函数不需要建立函数栈帧,提高程序运行效率


          可复用性


缺点:宏函数预处理阶段被替换,不会进行类型的检测,代码安全性低


          宏函数不能进行调试  


          容易出错,宏函数的每一部分都需要加上括号      


宏函数能否加分号?不可以,(如果是表达式中不小心多加了分号可以,支持两个分号同时出现 )


内联函数:填补了宏函数的缺点,继承了其优点(但是实现方式还是以空间换时间的做法)

相关文章
|
机器学习/深度学习 人工智能 算法
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
411 0
|
安全 程序员 uml
程序员编写技术文章需要的四个辅助神器 ,强烈建议收藏 !
编写技术文章是程序员分享经验和记录学习成果的重要方式。 为了让写作变得更轻松,有许多实用工具可以帮助提升效率,比如 Markdown 编辑器、画图工具等。 接下来,笔者将介绍四款简单实用的工具,帮助程序员更轻松地编写技术文章。
程序员编写技术文章需要的四个辅助神器 ,强烈建议收藏 !
|
11月前
|
机器学习/深度学习 存储 人工智能
2024阿里云AI交出答卷,全球领先!
2024阿里云AI交出答卷,全球领先!
638 9
2024阿里云AI交出答卷,全球领先!
|
11月前
|
人工智能 数据挖掘
扎根江西!江西数字集团与阿里云达成深度合作
扎根江西!江西数字集团与阿里云达成深度合作
350 6
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
315 5
|
应用服务中间件
Tomcat报错:The required Server component failed to start so Tomcat is unable to start
Tomcat报错:The required Server component failed to start so Tomcat is unable to start
388 0
|
监控 API 开发工具
深入理解API设计:构建高效的接口
【10月更文挑战第6天】深入理解API设计:构建高效的接口
304 0
|
算法 Java 程序员
解锁Python高效之道:并发与异步在IO与CPU密集型任务中的精准打击策略!
在数据驱动时代,高效处理大规模数据和高并发请求至关重要。Python凭借其优雅的语法和强大的库支持,成为开发者首选。本文将介绍Python中的并发与异步编程,涵盖并发与异步的基本概念、IO密集型任务的并发策略、CPU密集型任务的并发策略以及异步IO的应用。通过具体示例,展示如何使用`concurrent.futures`、`asyncio`和`multiprocessing`等库提升程序性能,帮助开发者构建高效、可扩展的应用程序。
532 0
|
测试技术
使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试
使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试
396 3
|
JSON Java 数据格式
万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求
万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求
339 0
万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求