如何使用宏来定义一个自定义函数呢?
首先我们来看下面这段代码

#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定义宏函数 的正确使用相关推荐

  1. C语言——关键字,define定义宏,指针,结构体

    常见关键字 auto break case char continue const default do double else enum extern float for goto if int l ...

  2. define定义的函数如何引用_「C与指针心得」25.预处理器-宏函数

    感谢您的阅读与点赞!欢迎关注:「大猫玩程序」,查看C语言系列文章 上一节讲了一些系统的预定义宏,这一节来讲一讲 宏定义.宏函数. 预处理常量 define: 预处理器指令从#开始,到最后第一个换行符为 ...

  3. #define定义宏常量和宏函数

    宏常量概念: 用#define指令,指定用一个符号名称代表一个常量:也称为符号常量. 例如:#define PI 3.1415 //注意行末没有分号 经过上述的指定后,本文件中从此行开始所有的PI都代 ...

  4. java define 宏_宏定义宏函数(日志输出)define

    最常见的就是 #indef __cplusplus 这表示支持C++语法 再如可以定义常量 #define MAX 100 这跟JAVA全局变量有什么区别呢? JAVA的变量是有类型的,这没有类型,这 ...

  5. #define定义宏(宏定义)

    文章目录 前言 一.预定义符号 二.#define详解 1.#define定义标识符 2.#define宏定义 小结 3.define 替换规则 前言 提示:本文将介绍一些预定义符号和#define宏 ...

  6. php 定义宏函数,汇编语言宏函数

    宏函数与宏过程有相似的地方,它也为汇编语言语句列表分配一个名称.不同的地方在于,宏函数通过 EXITM 伪指令总是返回一个常量(整数或字符串).如下例所示,如果给定符号已定义则宏 IsDefined ...

  7. vscode设置#define定义宏

    如何在Vscode里设置#define宏 makefile里定义宏可以直接 CFLAGS += -DARCH_X86_64_LINUX 在Vscode里设置#define宏的 步骤如下: 一.打开vs ...

  8. define定义的函数如何引用_C语言快速入门——使用#define让程序更易维护

    与变量在运行时可以通过赋值操作更改这一特性不同,常量是一种在程序执行过程中,其值不发生改变的量.我们目前介绍了int.float.char三种数据类型,与它们相对应的常量分别为整型常量.浮点常量.字符 ...

  9. 宏定义宏函数 if else语句报错:error: ‘else’ without a previous ‘if’(看似解决实际上没解决)

    代码 #include <stdio.h> #include <stdlib.h>#define ALOGE(...) { printf(__VA_ARGS__); print ...

最新文章

  1. 豆瓣评分9.1榜首图书:这本经典编程教材,第2版全面升级!
  2. PAT-BASIC-1016-部分A+B
  3. linux 定时执行shell脚本 定时任务
  4. border,padding,margin盒模型理解
  5. quercus mysql_让PHP运行在Glassfish中:quercus配置
  6. 利用SMS实现资产管理
  7. ORACLE数据库常见问题诊断方法 ---(常见错误篇)
  8. extjs4 冻结列_extjs4 事件处理
  9. spark中local模式与cluster模式使用场景_Spark内核及通信框架概述-针对面试(后面有源码分析)...
  10. Javascript特效:距离某个时间倒计时
  11. 深度解析copy与strong的区别
  12. 【MATLAB笔记】对矩阵进行满秩分解
  13. 如何将硬盘分区合并不丢失数据,合并两个硬盘分区不删除数据
  14. 《肖申克的救赎》观后感
  15. php 导出excel 进度条显示
  16. DSS部署-12、DSS安装
  17. 智汀智能家居,带给你梦幻般的生活
  18. 苹果连接电脑 计算机不显示硬盘,解决方法:Mac Mac计算机无法识别的硬盘解决方案...
  19. 关于遇到PermissionError: [Errno 13] Permission denied:···这个问题
  20. 【电赛】电设校赛常用电路整理

热门文章

  1. ElementUI中的el-table怎样实现多选与单选
  2. VS2013工具箱中使用WindowsMediaPlyer控件
  3. SpringBoot+AntV实现饼状图中的花瓣图
  4. 怎样查看已经记住密码的网站的密码
  5. 用于显示本地通知的跨平台插件flutter_local_notifications
  6. Dart Hello World 示例程序【Dart专题1】
  7. Security+考试总结
  8. C语言小游戏——三子棋
  9. java炒黄金_炒黄金追单的一些问题分析
  10. android布局加色,android – 如何以编程方式将LinearLayout添加背景颜色,并将权重添加到另一个布局...