define

define是C语言的预处理,作用是宏定义。

所谓宏,是将一些命令组织在一起,作为一个单独命令完成一个特定任务。

预处理命令以“#”号开头,如包含命令#include,宏定义命令#define等

一般都放在源文件的前面,它们称为预处理部分。

所谓预处理是指在进行编译之前所作的工作。 在进行编译C语言源程序的前一个步骤就是预处理。

define可以定义函数,常量(也就是定义一个不可变的变量,包括字符,字符串)。

使用方式:

(1)定义常量

#include<string.h>
#include<stdio.h>
#define PI 3.14
#define PI_Name "pi is"int main(void)
{printf("%s\t%f",PI_Name,PI); //\t是TAB。输出宏
}

定义了两个宏,一个数字,一个字符串。

我们使用正常的方式可以输出。

他们是不可修改的常量。如果对其修改,会报错。

(2)定义函数(有参数)

定义函数可以分为有参数,无参数(定义表达式)两种。

#include<string.h>
#include<stdio.h>
#define A (a,b)(a)+(b)int main(void)
{int x=A(12,11);printf("%d",x);
}

我们定义一个宏,是一个带有参数的宏。

A函数带有a,b两个参数,并返回a+b的值。

为什么a+b要写成(a)+(b)呢?

是为了保证运算。

请看下面的例子

#include<string.h>
#include<stdio.h>
#define A(a)a*aint main(void)
{int x,c=2;x=A(c+1);printf("%d",x);
}

我们希望返回a*a值。

此代码我们在A函数中填入的C+1也就是3,A函数返回的值应该是9。

但确实返回的5,这与我们所期望的值有很大的偏差。

因为,A(c+1)拆开后等于c*c+1所以等于5。

如果我们将a*a加上括号

不出所料,我们得到正确的值。

这回将宏拆开。

A(C+1)=(c+1)*(c+1)

括号将运算的优先级提高了。所以会得到一个正确的值。

但是!

有时候加这么样加括号还是不好用的! 为什么呢?请我们考虑一下运算的优先级。

请看下面的代码

#include<string.h>
#include<stdio.h>
#define A(a)(a)*(a)
int main(void)
{int x,c=2;x=99/A(c+1);printf("%d",x);
}

在上面的代码中A函数返回值是9,我们这把依旧让返回值等于9,不过我们让X的值等于99/A(c+1).

我们希望得到的值是11。

但是我们为什么得到的却是99呢?

因为优先级的关系,99/A(c+1)等于99/(c+1)*(c+1)也就是99/3*3,所以的值是99。

那怎么解决呢?

我们根据A函数的含义,将A函数内的表达式的预算优先级提高。

也就是

#include<string.h>
#include<stdio.h>
#define A(a)((a)*(a))
int main(void)
{int x,c=2;x=99/A(c+1);printf("%d",x);
}

OK

(3)定义函数(无参数)(定义表达式)

其实定义常量也算是定义函数无参数的一种,但是我为了好区分这两种定义宏的区别,特地分开。

毕竟定义的方法上有一定的区别。

#include<string.h>
#include<stdio.h>
#define A (a+3)
int main(void)
{int x,a=6;x=99/A;printf("%d",x);
}

我们依旧是定义一个A“函数”,但是无参数。

这回这个A“函数”可以理解为一个表达式。

请注意看在代码中使用A“函数”的方式,并没有括号,也就是A“函数”不接受参数。而且在再宏定义的时候A“函数”内a是存在代码内。

这种行为,更像是一种提前定义好的表达式。其中的“参数” 都是必须严格符合A“函数”。

也就是x=99/A;这句等于x=99/(a+3)

当然这句话也要考虑优先级的问题。所有A“函数”加上了括号。

因为是我想要a+3,根据含义,最后形成了A(a+3)这个样子

转载于:https://www.cnblogs.com/T-ARF/p/7537874.html

温故而知新_C语言_define_宏相关推荐

  1. c语言求前缀后缀大全,温故而知新_C语言_前缀++(--)和后缀++(--)

    前缀++(--)和后缀++(++)是有区别的. 再单独使用的时候是没有区别的,都是自身递增或者递减1. 但是综合使用起来会一样吗? 下面的例子都是++,替换成--也是一样,道理都是一样的. 请先看下面 ...

  2. mysql宏参数_C语言带参数的宏定义

    C语言允许宏带有参数.在宏定义中的参数称为"形式参数",在宏调用中的参数称为"实际参数",这点和函数有些类似. 对带参数的宏,在展开过程中不仅要进行字符串替换, ...

  3. c语言宏定义_C语言宏定义

    C语言的宏,是C的一大特点,宏定义可以用来定义常量,函数,为了全局替换起来方便. 比如: #define PIE 3.1415926 再比如: #define MAX(a,b) ( (a)>(b ...

  4. 怎么将c语言作业保存到word,C++程序中导出Word文档的简易方法_c语言

    如果您要在应用程序中处理Word文档,可以参考MSDN. Lori Turner. Automating Microsoft Office 97 and Office 2000,该文内容详细全面,但是 ...

  5. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  6. c语言程序设计编辑与调试环境实验报告,01程序设计基础实验报告_C语言程序设计基础.doc...

    01程序设计基础实验报告_C语言程序设计基础 程序设计基础 实验报告 题 目: C语言程序设计基础 院 (部): 管理工程学院 专 业: 信息管理与信息系统 班 级: 信管101 姓 名: 张三 学 ...

  7. c语言精品课程网站论文免费下载,【毕业论文_c语言程序设计精品课程网站的研究与实现6喜欢就下吧材料】...

    毕业论文_c语言程序设计精品课程网站的研究与实现(6)(喜欢就下吧) <毕业论文_<c语言程序设计>精品课程网站的研究与实现.doc>由会员分享,可免费在线阅读全文,更多与&l ...

  8. c 语言程序设计阚道宏,C语言用宏实现静态多态

    综述 多态性是面向对象程序设计的一个重要特征. 在C++语言中,多态指的是:具有不同功能的函数可以用同一个函数名,可以用一个函数名调用不同内容的函数. C++的多态分为两种: 1. 静态多态性(编译时 ...

  9. vc 运行c语言步骤,第1章_C语言概述(vc++环境如何运行c语言程序)[精选].ppt

    第1章_C语言概述(vc环境如何运行c语言程序)[精选] C语言程序设计 授课对象:电子商务06 时间安排: 理论课(1-9周): 星期一 5-6节 9407D 星期三 5-6节 9410D 实验课( ...

最新文章

  1. 最佳的七十五个网络分析和安全工具
  2. 4.Vue 模板语法
  3. C#基础视频教程4.3 如何编写简单的计算器
  4. 《R语言数据挖掘:实用项目解析》——1.11 apply原理
  5. 《C++程序设计语言(特别版)》——忠告
  6. 查找对方IP地址经典技巧汇总
  7. Manjaro Linux 魔兽世界 使用黑盒工坊安装插件
  8. 7-1 循环-Fibonacci数列的运算 (50 分)
  9. 踩坑日志:go并发读取文件
  10. 前端吃香还是后端吃香?
  11. 虚拟机Ubuntu18.04中文输入法设置(同时保留系统英文语言)
  12. 融资1350万美元,待开启的元宇宙·数字人
  13. Windows中Perl命令的安装
  14. linux怎么共享存储,什么是ISCSI,及Linux下怎么样通过ISCSI实现共享存储
  15. 一个可直接使用的轻量级博客开源系统
  16. 大江论坛服务器怎么又在维护,大江论坛主讨论区
  17. Python批量给文件改名的两种方法
  18. mysql udf shell_MySQL使用UDF调用shell脚本
  19. 跨境支付与区块链支付结合的好处
  20. Hadoop集群之HDFS伪分布式安装 HA(二)

热门文章

  1. 3Dshader之球形环境映射(sphere environment mapping)
  2. 用vector编写一个矩阵模板
  3. vector和string
  4. python函数测试_Python测试函数的方法之一
  5. 物体检测,用于检测红灯笼demo(含训练代码)
  6. html页面酷炫,5个酷炫、实用的HTML标签和属性介绍
  7. 像科学家一样思考python_像计算机科学家一样思考Python (第2版) 中文pdf完整版
  8. html小游戏代码_厉害!84 行 JavaScript 代码实现塔式堆叠游戏
  9. Java的scjp,Java(一些基础) for SCJP
  10. AttributeError: module ‘onnxruntime‘ has no attribute ‘InferenceSession‘