【无标题】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=1int b;
b=a+1

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

int a=1int 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
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值