宏和函数

2023-10-26

此为C语言的基础,和Linux内核关系并不大,不过还是作为补充知识点介绍一下好了。宏非常频繁的用于执行简单的计算,比如在两个表达式中寻找其中较大的一个:

#define MAX(a,b) ((a)>(b)?(a):(b))

如果使用函数来实现的话就比较慢,宏的话在编译的时候就完成工作,所以使用宏远比使用函数调用效率来的可观。和使用函数相比,使用宏的不利之处就在于每次使用宏的时候,一个宏定义代码的拷贝就插入到程序中,这样会增加程序的长度。除非非常的短,否则使用宏可能大幅增加程序的长度。

1.宏的副作用,就拿上面MAX举例

#define MAX(a,b) ((a)>(b)?(a):(b))
int x=5;
int y=8;
int z=MAX(x++,y++)
printf("%d %d %d\n",x,y,z);

输出结果是:6,10,9

和往常一样,只要检查一下宏替换代码如下:

z=((x++)>(y++)?(x++):(y++));较大的数会增加两次哎!


2.#define需要注意的地方

  • #define name stuff

如果stuff比较长,每行的末尾要加上\。

#define DEBUG_PRINT printf("string:%s,"\
						"x=%d,y=%d,z=%d",\
						"hello",x,y,z)
int main()
{
	int x=1,y=2,z=3;
	DEBUG_PRINT;
	return 0;
}

我们利用了相邻的字符串会自动连接为一个字符串的特性。

  • #define name(param-list) stuff
比如#define SQUARE(x) x*x
这里有个问题:a=5,SQUARE(a+1)就有问题。乍一看没啥问题,觉着会输出36,但是结果却是11.想知道为什么?宏替换如下:a+1*a+1=11。解决方法就是给宏加上括号
#define SQUARE(x) (x)*(x)
我们再看另外一种情况
#define DOUBLE(x) (x)+x(x)
10*DOUBLE(2)得到多少?本来我们想得到的结果是:40,但是实际结果却是22
所以改为:#define DOUBLE(x) ((x)+(x))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

宏和函数 的相关文章

  • JackSon Double类型转换为BigDecimal类型

    话不多说直接放代码 SimpleModule module new SimpleModule module addSerializer Double class new StdSerializer BigDecimal class Over
  • Java学习笔记-----包,final,权限修饰符和代码块

    一 包 包就是文件夹 用来管理各种不同功能的Java类 方便后期代码维护 包名的规则 公司域名反写 包的作用 需要全部英文小写 见名知意 使用其他类的规则 使用其他类时 需要使用全类名 包名 类名 使用同一个包中的类时 不需要导包 使用ja
  • No identifier specified for entity: com.aoshen.entity.User

    问题描述 在整合JPA的时候 用代码来生成数据库表和数据 在实体类User的主键ID上加 Id注解 有一个坑 Id 有两个注解方法 当你引入第二个时候就会报错 org springframework beans factory BeanCr
  • 一个人才数据网的爬虫软件

    最近表哥让我帮他写个软件 定时爬取一个人才数据网站的信息 思路和方法很简单 不过过程中遇到的坑真的不少 今天对整个软件的开发过程做个记录 网站是 余姚人才网 链接就不上了 百度第一个就是 还是老样子 python request beaut
  • SpringCloud基础8——多级缓存

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 多级缓存流程 2 JVM进程缓存 2 1 d
  • Linux文件上传与下载

    之前都是用Xftp工具在本地和linux系统之间上传下载文件 最近觉得麻烦 因为平时用Xshell连接 要传输文件的时候还要额外使用别的工具 下面使用 lrzsz 即可完成 Linux 的文件上传与下载 lrzsz 的安装 我在测试的时候

随机推荐

  • 55-基于栈的指令集与基于寄存器的指令集详细比对

    基于栈的指令集与基于寄存器的指令集详细比对 现代JVM在执行Java代码的时候 通常都会将解释执行与编译执行二者结合起来进行 解释执行 就是通过解释器来读取字节码 遇到相应的指令就去执行该指令 编译执行 就是通过即时编译器 Just In
  • 如何删除gitlab上默认受保护的master主分

    这里写自定义目录标题 1 找到对应项目 去到仓库 分支 查看分支情况 如果为 pr 点击 项目设置 2 展开对应 Protected Branches 3 点击 unprotect 就ok了 4 完成后 回到当前 ok 了 这样就可以使用
  • python怎么安装matplotlib.pyplot

    我先解释一下 这是windows系统下的安装方式 我也是刚入门 不知道自己的安装方法是否适合别人 就不多说了 以下是过程 1 https pypi python org pypi matplotlib 有一个下载选项 在这个网站上选择车轮文
  • Python微信小程序,实现自动回复等功能(itchat模块)

    本文是使用Python的itchat模块进行微信私聊消息以及群消息的自动回复功能 必须在自己的微信中添加微信号xiaoice ms 微软的微信机器人 才能实现 直接复制代码运行之后扫一扫二维码即可 经过测试 该程序能够保持几小时的时间 实现
  • [Codeforces] combinatorics (R1600) Part.1

    Codeforces combinatorics R1600 Part 1 题单 https codeforces com problemset tags combinatorics 1201 1600 52B Right Triangle
  • 在现实实践中会遇到的机器学习算法总结

    在理解了我们需要解决的机器学习问题之后 我们要思考需要收集什么数据以及我们可以用什么算法 本文我们会过一遍最流行的机器学习算法 大致了解哪些方法可用 很有帮助 机器学习领域有很多算法 然后每种算法又有很多延伸 所以对于一个特定问题 如何确定
  • 【学习笔记】启动Nginx、查看nginx进程、查看nginx服务主进程的方式、Nginx服务可接受的信号、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级

    1 启动nginx的方式 cd usr local nginx ls nginx c nginx conf 2 查看nginx的进程方式 root localhost nginx ps ef grep nginx root localhos
  • 103-----JS基础-----添加删除记录-删除

    一 代码 很简单 看一下即可
  • TensorFlow学习-anaconda的方式安装TensorFlow教程

    前置准备 首先在说到安装TensorFlow前 要安装好anaconda 这里引入一篇教程anaconda安装与使用 初学者另外也需要在官网安装对应的python包python官网 有这些前置准备后 就可以安装TensorFlow了 采用a
  • linux下ftp的使用命令

    1 登录ftp ftp 0 0 0 0 输入用户名和密码 登录成功 2 ftp帮助 help 显示本地可用命令 rhelp 显示远程终端可以使用的命令 3 切换目录 cd 切换远程终端的当前工作目录 lcd 切换本地的当前工作目录 pwd
  • Centos7离线安装依赖包

    Centos离线安装依赖包 文章目录 Centos离线安装依赖包 1 下载依赖包 1 1 使用yum install downloadonly下载安装包及其依赖 1 2使用yumdownloader下载安装包及其依赖 2 安装下载好的依赖包
  • vuex的基本用法(提炼公共文件import all vuex modules)

    1 第一步是你的package json中需要有 vuex 3 5 1 如果没有安装vuex 就先安装一下 2 在src下创建一个文件store store下创建一个文件modules index js 下面继续创建文件 最终的目录文件如下
  • Discourse搭建

    首先要链接上服务器 首先WINDOWS打开CMDER MAC的话打开Terminal 都是类似的 在窗口输入 ssh root ALIYUN IP 这里的ALIYUN IP是你的服务器的公网IP地址 举个例子 我的公网IP是47 88 12
  • Qt中执行多条shell语句

    在Qt中执行一个shell指令常用QProcess类来完成 常见的用法示例如下 QProcess process process start find opt name ts calibrate str是需要执行的命令 flag proce
  • python之weditor定位的使用

    1 driver text 书城 定位元素的方式 属性定位 2 driver text 书城 click 点击元素 3 driver resourceId click 点击搜素按钮 4 driver resourceId send keys
  • 我在支付宝花了 1 分钟,查到了对象的开房记录

    来源丨Hack https mp weixin qq com s 6fDFqBQMqUVdkJG Dg7iCw 在大数据时代下 不管你做什么都会留下蛛丝马迹 只要学会把各种软件运用到极致 捉奸简直轻而易举 今天就来给大家分享一下 什么叫大数
  • Python基础学习:numbers模块

    numbers 数字抽象基类 其源代码存储在 Lib numbers py numbers模块定义了数字抽象基类的层次结构 逐渐定义更多的操作 该模块中定义的任何类型都不能实例化 1 数字塔 class numbers Complex 数字
  • Python EasyNote 1

    描述 Python strip 方法用于移除字符串头尾指定的字符 默认为空格或换行符 或字符序列 注意 该方法只能删除开头或是结尾的字符 不能删除中间部分的字符 Python split 通过指定分隔符对字符串进行切片 如果参数 num 有
  • 05 CoCos Creator-native.log

    1 Compile failed 编译保存信息 查看报错文件 C Users Administrator CocosCreator logs native log Error Compile failed The log file path
  • 宏和函数

    此为C语言的基础 和Linux内核关系并不大 不过还是作为补充知识点介绍一下好了 宏非常频繁的用于执行简单的计算 比如在两个表达式中寻找其中较大的一个 define MAX a b a gt b a b 如果使用函数来实现的话就比较慢 宏的