C语言-宏定义中括号的问题

最近面试的时候 面试官让我写了一个用宏定义返回两个参数中的较小值,我直接就写了

#define min(a,b) (a<b)?a:b   

然后面试官问了我一句需要写括号么,当时问的有些懵,犹豫之后说应该不需要了吧。

回来之后就仔细查了一下,发现自己还是犯了错误。

首先我们需要知道宏定义是怎么在代码中使用的,在代码预编译阶段,宏定义是直接替换的

例如:
在代码中我们使用了min(a,b),而在代码预编译阶段就会直接将min(a,b) 直接替换成a<b?a:b

因为替换的原因,所以就可能会存在一些问题

例如:

#include<stdio.h>
#define min(a,b) (a>=b)? b:a
int mina(int a,int b){
return a>=b? b:a;
}
int main(){
printf("宏定义结果:%d\n",min(3,1)-1);
printf("函数结果:%d",mina(3,1)-1);
}

我们会发现运算的值
宏定义结果:1
函数结果:0

这里出现的问题就是因为优先级问题,当宏定义直接被替换成(a>=b)? b:a之后可以看成

printf("宏定义结果:%d\n",(3>=1)? 1:3-1);

这样答案应该就很明显了

所以宏定义中增加括号会增强代码的健壮性以及安全性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值