用#define宏实现Add函数

news2024/11/16 22:24:09

✋作者:阿润菜菜

📖专栏:C语言

我们知道#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
}

结果: 

 分析:我们想得到的结果应该是(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;算术运算符比逻辑运算符优先级高
}

结果

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

宏函数的优缺点

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

           可复用性

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

           宏函数不能进行调试   

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第九层(10):STL之函数对象

文章目录前情回顾函数对象概念特点谓词概念内建函数对象分类算术仿函数关系仿函数逻辑仿函数下一座石碑🎉welcome🎉 ✒️博主介绍:一名大一的智能制造专业学生,在学习C/C的路上会越走越远,后面不定期更新有关C/C语法&a…

你是如何学习 Java 的?

每一个行业中能成为大佬的人,一定都有他自己一套具有独到见解的方法...... 这个问题我很有发言权,从刚毕业做Java实习生月薪2k,到现在干了5年Java开发月薪43k,一直都在保持不断学习的状态。以我个人的经验来看,一个程…

视频分割新范式:视频感兴趣物体实例分割 VOIS

1. 背景视频中物体分割是视频理解的基础算法,也是对淘宝商品视频分析和加工所依赖的重要能力。传统的视频分割任务一般分为两种类型:一种是VOS(Video Object Segmentation),该任务需要在第一帧给出物体的初始分割标注&…

Linux系列 目录和文件管理

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 简介 本章重点 一.检查文本内容 ​编辑 1.cat命令——显示并…

MySQL分表查询之Merge存储引擎实现

概念介绍 MySQL 分表之后怎么进行联合查询?用有表数量限制的 union all,还是汇总到一张表再查询,亦或用Sphinx( 高性能SQL全文检索引擎 )? 在这篇文章里,介绍使用 Merge [mɜːrdʒ] 存储引擎…

浅读人月神话(2)

读书笔记:今日翻书浅读,从《为什么巴比伦塔会失败》开始至《干将莫邪》结束,巴比伦塔的建造对当下项目推进有广泛借鉴意义,今天这几个章节在PMBOK中有一些可以互相对照学习的内容,《为什么巴比伦塔会失败?》…

荔枝派 zero 使用 Jlink 调试

Jlink 所谓硬件版本,就是这个调试器的硬件是第几代,我手上的这个是 V8 所谓固件版本,就是这个调试器主芯片中内置的软件是什么版本,我刷入的是 J-Link ARM V8 compiled Nov 28 2014 13:44:46 所谓 Jlink 工具版本,就…

记录--原生 canvas 如何实现大屏?

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 可视化大屏该如何做?有可能一天完成吗?废话不多说,直接看效果,线上 Demo 地址 lxfu1.github.io/large-scree…。 看完这篇文章(这个项目)&#xff…

在线支付系列【13】微信支付之签名验签流程分析

有道无术,术尚可求,有术无道,止于术。 文章目录前言签名生成签名验证总结前言 在上篇文档中,我们简单实现了对接微信支付的几个接口。了解到wechatpay-apache-httpclient框架自动实现了签名和验签,接下来跟踪下源码&a…

LeetCode-136. 只出现一次的数字

目录题目分析哈希集位运算题目来源 https://leetcode.cn/problems/single-number/ 题目分析 题目有个条件可谓相当重要,即凡重复的元素最多重复一次(原话:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个…

详解Mybatis-Plus中分页插件PaginationInterceptor, MybatisPlusInterceptor在SpringBoot中的使用

文章目录1. 描述1.1 MybatisPlusInterceptor1.2 InnerInterceptor2. 实现2.1 不带条件的分页查询2.2 带条件的分页查询2.3 简述Page类3. 注意事项1. 描述 1.1 MybatisPlusInterceptor 我们在开发的过程中,经常会遇到分页操作,其分为逻辑分页和物理分页…

Gif动态图片如何用静图制作?教你静图合成动图的方法

gif动图如何制作?相信对于gif动图大家都不陌生,在平时的聊天软件中、公众号文章中都可以看到。那么,要如何制作gif动图呢?下面,就给教大家两个在线gif制作(https://www.gif.cn/)的方法&#xff…

综合案例【商品管理系统-Java基础版】(附完整源码)

Java语言的一个超级简易的商品管理系统,适合初学者练手 源码包无法上传至资源(blog已经超级完整啦)如果还是需要完整源码src包可私分享 目录1 项目分析1.1 用户模块(普通用户、管理员用户)1.1.1前端系统(普…

FluentReader为什么称之为高颜值的rss阅读器

Fluent Reader 这是一款 RSS 阅读器。对于很多年轻的网友来说,RSS 这个名词可能有点陌生。简单来说只要某个网站支持 RSS,你订阅了 RSS 后,一旦网站更新了内容,就会推送到你面前。这时候,我们就需要一款像 Fluent Rea…

全屋智能三国志

刚刚过去的春节假期,对我来说,是一个收集现实素材、感应社会变化的好机会。也确实发现了不少新趋势,一个结论是:智能家居正在酝酿新一轮的市场浪潮。以央视春晚作为切口,每年央视春晚的广告投放,都一定程度…

vscode 配置 plantuml

1、首先安装 plantuml 插件 2、安装 java 开发环境 如果是 mac 系统,直接执行 brew install java ,然后按照下图执行下提示中的命令即可 如果是 windows 系统,需要去官网下载 java jdk,安装好之后添加运行路径到 path 中 https://…

基于 ShardingSphere 的分布式数据库负载均衡架构搭建实战

本文主要分为 3 部分,将依次介绍: 基于 ShardingSphere 的分布式数据库「负载均衡架构搭建」要点结合实际的「用户问题案例」,介绍引入「负载均衡」的影响介绍并展示 ShardingSphere 分布式数据库在云上的「一站式解决方案」 文章目录Shardi…

LED背光车载驱动IC 可支持48通道

特性电源电压范围-VDD:3.3V~5.5V-VLED:27V(max)48 个恒流输出通道- 通道恒流输出范围 0~50mA一 通道间电流输出偏差小于3%- 芯片间电流输出偏差小于 3%Low Knee Voltage:0.55V小于20mA0.6V 大于20mA最大支持4扫,内嵌行控制信号通道灰度实现-支持 PWM/PAMPWM驱动 -灰…

云帆文档管理系统版本更新说明:v4.6.0

一、新增及优化功能资料管理新增打包下载管理端增加资料查阅菜单,管理端和用户端用户有同样的查阅权限,方便其快速的查阅企业的资料信息前端下载文档格式添加下载水印,水印显示的是下载的用户和日期采购合同增加智能识别功能资料管理添加关键…

KPI考核系统实战之二:swagger框架

KPI考核系统实战之二:swagger框架一、asp.net core 3.1二、融合swagger1.Nuget安装Swashbuckle.AspNetCore2.Startup.cs 注册Swagger服务,使用swagger中间件一、asp.net core 3.1 使用Visual Studio 2022,搭建asp.net core weiapi开发平台&a…