最近面试的时候 面试官让我写了一个用宏定义返回两个参数中的较小值,我直接就写了
#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);
这样答案应该就很明显了
所以宏定义中增加括号会增强代码的健壮性以及安全性