#define定义宏函数 的正确使用
如何使用宏来定义一个自定义函数呢?
首先我们来看下面这段代码
#define SQUARE(x) x*x
int main()
{
int a = 5;
printf("SQUARE(a): %d\n",SQUARE(a)); //这个值为25
printf("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
#define定义宏函数 的正确使用的更多相关文章
- c c++ #define 定义假函数
#define Add(a,b) ((a)+(b)) #define Max(a,b) ((a)>(b)?(a):(b)) 这就定义了一个假的函数 说白了就是字符串替换 这样在写代码时能 ...
- 结构体中使用#define定义宏
struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* ...
- php基础:define()定义常数函数
define(); 常量类似变量,不同之处在于: 在设定以后,常量的值无法更改 常量名不需要开头的美元符号 ($) 作用域不影响对常量的访问 常量值只能是字符串或数字 <?php define( ...
- [c++] 用宏定义一个函数
要点:变量都用括号括起来,防止出错,结尾不需要;.在实际编程中,不推荐把复杂的函数使用宏,不容易调试.多行用\ 要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和 ...
- C++中的间接宏函数
宏函数对于每个C++程序员都决不陌生,就算是初出茅庐的C++程序员也知道如何定义.使用宏函数. 但是当初学者看到类似于以下这种宏函数嵌套的时候,可能还是会比较嘀咕, #define CONVERT ...
- IOS学习之路-- 指针&宏函数
如果*p被()包住,说明指针变量p将来指向的是函数 //声明一个指针变量 //int (*p)(int, int) = sum; int (*p)(int, int); p = sum; // 如果* ...
- 使用#define定义字面值和伪函数
#define是C语言提供的宏命令,其主要目的是:在编程时,为程序员提供一定方便,并能在一定程度上提高程序的执行效率.#define将一个标示符定义为一个字符串,该标示符被称为宏,被定义的字符串称为字 ...
- readb(), readw(), readl(),writeb(), writew(), writel() 宏函数【转】
转自:http://www.netfoucs.com/article/hustyangju/70429.html readb(), readw(), readl()函数功能:从内存映射的 I/O 空间 ...
- C/C++预定义宏
编译器识别预定义的 ANSI/ISO C99 C 预处理宏,Microsoft C++ 实现将提供更多宏.这些预处理器宏不带参数,并且不能重新定义. ANSI 兼容的预定义宏 __FILE__,__L ...
随机推荐
- StorageClass-动态PVC
StorageClass 之前我们部署了PV 和 PVC 的使用方法,但是前面的 PV 都是静态的,什么意思?就是我要使用的一个 PVC 的话就必须手动去创建一个 PV,我们也说过这种方式在很大程度上 ...
- 1、ECharts(中国地图篇)的使用
一.网址: http://echarts.baidu.com/download.html点击: 完整下载文件: echarts.min.js ...
- 怎样获取响应头: Response Header
1. 使用 xhr.getResponseHeader()可以获取指定响应头字段值. function getHeaderTime() { console.log(this.getResponseHe ...
- beego 参数配置
详细配置请参考:https://godoc.org/github.com/astaxie/beego#pkg-constants. App配置 AppName 应用名称,默认是 beego.通过bee ...
- mysql5.7 密码字段名更改
由password更改为authentication_string update user set authentication_string=password("123456") ...
- Shiro——入门Demo
Shiro——入门Demo 环境- 引入相关maven依赖, shiro-core,commons-logging 配置shiro配置文件:ini后缀 主方法测试: import org.apach ...
- K2 BPM_K2受邀出席SAP研讨会:共话“智能+”时代下的赋能与转型_全业务流程管理专家
3月5日,第十三届全国人大二次会议在北京召开.政府工作报告首次出现“智能+”,并明确指出2019年,要打造工业互联网平台,拓展“智能+”,为制造业转型升级赋能.从政府工作报告中不难看出,“智能+” ...
- 为何一线城市的企业更愿意选择 Spring Cloud?
最近公司正在搭建微服务框架,处于小白的我,赶紧借书,上网,实操的学习了一下,下面是一些自己的入门的总结: 目录: 一.怎么理解Spring Cloud? 一.Spring Cloud 的优势在哪? 一 ...
- 三、DQL语言
目录 一.基础查询 (一)语法 (二)特点 (三)示例 二.条件查询 (一)语法 (二)筛选条件的分类 三.排序查询 (一)语法 (二)特点 四.常见函数 (一)介绍 (二)分类 五.单行函数 (一) ...
- linux 下安装 jdk1.7
1.官网 下载jdk7版本 地址: http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-jav ...