#define定义宏函数 的正确使用
如何使用宏来定义一个自定义函数呢?
首先我们来看下面这段代码
#define SQUARE(x) x*x
int main()
{int a = 5;printf("SQUARE(a): %d\n",SQUARE(a)); //这个值为25printf("SQUARE(a+1): %d\n", SQUARE(a + 1)); //第一反应是打印36,其实打印的是11
}
运行结果:
为什么会出现这样的结果呢?原因是编译器在处理SQUARE(a+1)的时候,处理成了 a+1a+1 ,所以a = 5时,最后结果为 11,当我们的宏定义为 #define SQUARE(x) xx 时,结果就是36,那这种宏的定义方法是正确的吗?
再看看下面这段代码:
#define MAX(a,b) (a>b?a:b)
int main()
{int a = 5;int b = 3;printf("MAX(a, b): %d\n", MAX(a, b)); //很明显,打印的是5.printf("MAX(a&1, b&1): %d\n", MAX(a&1, b&)); //这里打印的是5吗?
}
运行结果如下:
那这又是怎么回事呢?原因是编译器将 MAX(a&1, b&1) 处理为 a&1>b&1?a&1:b&1 ,这里就要考虑运算符的优先级问题了。这篇博客介绍了C语言运算符优先级 。
所以我们可以看到>的优先级高于&,所以运算过程如下图:
总结:宏函数的正确写法是 每一个元素加括号,并且在最外层也加括号,如#define MAX(a,b) ((a)>(b)?(a):(b?).
仅为个人理解,如有错误请指出!
---------------------
作者:故渊~
来源:CSDN
原文:https://blog.csdn.net/lvxin15353715790/article/details/87891991
版权声明:本文为博主原创文章,转载请附上博文链接!
参考链接:
详解宏定义(#define)【转】 - biqioso的博客 - CSDN博客 https://blog.csdn.net/biqioso/article/details/80420152
转载于:https://www.cnblogs.com/tongongV/p/10989680.html
#define定义宏函数 的正确使用相关推荐
- C语言——关键字,define定义宏,指针,结构体
常见关键字 auto break case char continue const default do double else enum extern float for goto if int l ...
- define定义的函数如何引用_「C与指针心得」25.预处理器-宏函数
感谢您的阅读与点赞!欢迎关注:「大猫玩程序」,查看C语言系列文章 上一节讲了一些系统的预定义宏,这一节来讲一讲 宏定义.宏函数. 预处理常量 define: 预处理器指令从#开始,到最后第一个换行符为 ...
- #define定义宏常量和宏函数
宏常量概念: 用#define指令,指定用一个符号名称代表一个常量:也称为符号常量. 例如:#define PI 3.1415 //注意行末没有分号 经过上述的指定后,本文件中从此行开始所有的PI都代 ...
- java define 宏_宏定义宏函数(日志输出)define
最常见的就是 #indef __cplusplus 这表示支持C++语法 再如可以定义常量 #define MAX 100 这跟JAVA全局变量有什么区别呢? JAVA的变量是有类型的,这没有类型,这 ...
- #define定义宏(宏定义)
文章目录 前言 一.预定义符号 二.#define详解 1.#define定义标识符 2.#define宏定义 小结 3.define 替换规则 前言 提示:本文将介绍一些预定义符号和#define宏 ...
- php 定义宏函数,汇编语言宏函数
宏函数与宏过程有相似的地方,它也为汇编语言语句列表分配一个名称.不同的地方在于,宏函数通过 EXITM 伪指令总是返回一个常量(整数或字符串).如下例所示,如果给定符号已定义则宏 IsDefined ...
- vscode设置#define定义宏
如何在Vscode里设置#define宏 makefile里定义宏可以直接 CFLAGS += -DARCH_X86_64_LINUX 在Vscode里设置#define宏的 步骤如下: 一.打开vs ...
- define定义的函数如何引用_C语言快速入门——使用#define让程序更易维护
与变量在运行时可以通过赋值操作更改这一特性不同,常量是一种在程序执行过程中,其值不发生改变的量.我们目前介绍了int.float.char三种数据类型,与它们相对应的常量分别为整型常量.浮点常量.字符 ...
- 宏定义宏函数 if else语句报错:error: ‘else’ without a previous ‘if’(看似解决实际上没解决)
代码 #include <stdio.h> #include <stdlib.h>#define ALOGE(...) { printf(__VA_ARGS__); print ...
最新文章
- 豆瓣评分9.1榜首图书:这本经典编程教材,第2版全面升级!
- PAT-BASIC-1016-部分A+B
- linux 定时执行shell脚本 定时任务
- border,padding,margin盒模型理解
- quercus mysql_让PHP运行在Glassfish中:quercus配置
- 利用SMS实现资产管理
- ORACLE数据库常见问题诊断方法 ---(常见错误篇)
- extjs4 冻结列_extjs4 事件处理
- spark中local模式与cluster模式使用场景_Spark内核及通信框架概述-针对面试(后面有源码分析)...
- Javascript特效:距离某个时间倒计时
- 深度解析copy与strong的区别
- 【MATLAB笔记】对矩阵进行满秩分解
- 如何将硬盘分区合并不丢失数据,合并两个硬盘分区不删除数据
- 《肖申克的救赎》观后感
- php 导出excel 进度条显示
- DSS部署-12、DSS安装
- 智汀智能家居,带给你梦幻般的生活
- 苹果连接电脑 计算机不显示硬盘,解决方法:Mac Mac计算机无法识别的硬盘解决方案...
- 关于遇到PermissionError: [Errno 13] Permission denied:···这个问题
- 【电赛】电设校赛常用电路整理
热门文章
- ElementUI中的el-table怎样实现多选与单选
- VS2013工具箱中使用WindowsMediaPlyer控件
- SpringBoot+AntV实现饼状图中的花瓣图
- 怎样查看已经记住密码的网站的密码
- 用于显示本地通知的跨平台插件flutter_local_notifications
- Dart Hello World 示例程序【Dart专题1】
- Security+考试总结
- C语言小游戏——三子棋
- java炒黄金_炒黄金追单的一些问题分析
- android布局加色,android – 如何以编程方式将LinearLayout添加背景颜色,并将权重添加到另一个布局...