【无标题】c语言--#define替换规则

简介: 【无标题】c语言--#define替换规则

本文对#define 定义的有宏参数替换进行描述,望觉得对你们有帮助的程序猿们小小点赞一下。

一.#define定义宏

#define 机制允许把参数替换到文本中,这种实现通常称为宏(marco)或定义宏(define marco)

下面是宏的声明方式:

#define name(parament-list)stuff

注意:参数列表左括号必需与name相连

#define SQUARE(x) x*x

这个宏接收一个参数

SQUARE(5)

运行程序时,预处理器就会用下面这个表达式替换上面的

#define SQUARE(5) 5*5

结果为25。

但这个宏还存在问题

观察下面的代码

int a=5;
printf("%d", SQUARE(a+1))

答案并不是我们认为的36

事实上,它输出的结果是11

为什么?

替换文本时,x被替换为 a+1

然后 语句实际为:

printf("%d", a+1*a+1)

结果自然为11

改进方法也很简单,在宏定义是加上两个括号

#define SQUARE(x) (x)*(x)

再次运行

printf("%d", (a+1)*(a+1))

结果为36

你以为代码就完善了吗

还有一个宏定义

#define ADD(x) (x)+(x)

int a=5;
printf("%d",10* ADD(a))

你认为结果是多少

100 or 其它

太年轻了

请看代码

运行替换完后:

int a=5;
printf("%d",10*(5)+(5 ))

结果为 55

怎么改进呢,

也是加上一个括号

#define ADD(x) ((x)+(x))

再次运行变为

printf("%d",10*((5)+(5) ))

结果自然为100。

二.宏参数的副作用

这里的副作用指的是改变了其它的值

int a=1;
int b;
b=a+1;

上述代码在给吧b赋值的时没有改变a的值

无副作用

int a=1;
int b;
b=a++;

给b赋值的同时改变了a的值

就产生了副作用

当宏参数在宏的定义中出现超过一此的时候,如果参数带有副作用,那么你在使用宏时会带来不可预测的效果。

代码如下

#define MAX(a,b)(a)>(b)?(a):(b)
...
x=3;
y=4;
z=MAX(x++,y++)
printf("%d %d %d",x,y,z);

根据上述内容可以尝试算一算

解析如下:

z=(x++)>(y++)?(x++):(y++)
//明显x++<y++,所以结果再进行一次y++
//x=4,y=6,z=5


相关文章
|
5月前
|
存储 程序员 C语言
C语言变量命名规则
C语言变量命名规则
259 0
|
5月前
|
程序员 编译器 C语言
『C语言进阶』隐式类型转换规则
『C语言进阶』隐式类型转换规则
|
5月前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
4月前
|
编译器 C语言
【C语言】:中移位操作符,位操作符详运算规则详解
【C语言】:中移位操作符,位操作符详运算规则详解
33 1
|
3月前
|
存储 编解码 程序员
C语言17---计算机的存储规则
C语言17---计算机的存储规则
|
4月前
|
C语言
【C语言基础篇】数组传参规则详解
【C语言基础篇】数组传参规则详解
|
5月前
|
存储 编译器 C语言
【C语言】数据的存储(基本类型介绍、原码、反码、补码详解、大小端的理解、浮点数的存储规则)
【C语言】数据的存储(基本类型介绍、原码、反码、补码详解、大小端的理解、浮点数的存储规则)
62 0
|
5月前
|
自然语言处理 编译器 Linux
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(下)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
46 0
|
5月前
|
程序员 编译器 C语言
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(中)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
38 0
|
5月前
|
存储 程序员 编译器
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(上)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
43 0