64,282
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
//
#define MAX(x,y) x > y ? x : y//不加括号
#define MAXB(x,y) (x > y ? x : y)//加上括号
int main(){
printf("%d\n",MAX(3,4) + MAX(5,6));//输出结果是5【错误】
printf("%d\n",MAXB(3,4) + MAXB(5,6));//输出结果是10【正确】
return 0;
}
不加括号的方式做两个取最大值操作的话,会发现得到错误的答案,具体可以尝试将宏定义在使用的地方展开加以分析:MAX(3,4)+MAX(5,6)展开即为(这里采用x1=3、y1=4、x2=5、y2=6方便说明):x1 > y1 ? x1 : y1 + x2 > y2 ? x2 : y2
1- 首先第一步执行(用红色标出):x1 > y1 ? x1 : y1 + x2 > y2 ? x2 : y2==(得到)==》y1 + x2 > y2 ? x2 : y2;
2- 然而当我们再往下执行y1 + x2 > y2 ? x2 : y2的时候发现y1+x2 = 10 > y2 = 6,所以返回的是x2 = 5;
3- 当然啦,加上括号就相当于限制了运算优先级,答案正确。
可以看出再使用宏的时候,涉及到宏函数的实现最好是加上函数主体部分的括号,防止因为函数调用等原因导致结果出现错误!