为什么max(0,1)
在此程序中的行为与max(1,0)
不同?
#define max(a,b) ((a)>(b))?(a):(b)
int main()
{
printf("max(0,1) = %d \n",max(0,1));
printf("max(0,1)+1 = %d \n",max(0,1)+1);
printf("max(0,1)+2 = %d \n",max(0,1)+2);
printf("max(1,0) = %d \n",max(1,0));
printf("max(1,0)+1 = %d \n",(max(1,0)+1));
printf("max(1,0)+2 = %d \n",(max(1,0)+2));
return 0;
}
输出:
max(0,1) = 1
max(0,1)+1 = 2
max(0,1)+2 = 3
max(0,1) = 1
max(1,0)+1= 1
max(1,0)+2= 1
如果使用一个额外的括号,为什么这些表现良好?
#define max(a,b) (((a)>(b))?(a):(b))
答案 0 :(得分:2)
因为?:
条件运算符的运算符优先级低于二进制+
运算符。
因此max(1,0)+1
被解释为1>0?1:(0+1)
为什么不应该使用类似函数的宏的完美示例。
答案 1 :(得分:1)
三元运算符? :
的运算符优先级非常低:远低于加法。因此,您需要将三元组放在括号中,当它用于计算最大值时,最终的加法(如果有的话)是在三元之后计算的。
您可以随时使用取消宏:
max(1,0) + 1
取消勾选,首先定义max
到(1) > (0) ? (1) : (0) + 1
,当然是1
。对于第二个定义,((1) > (0) ? (1) : (0)) + 1
为2
。
答案 2 :(得分:0)
宏扩展#define max(a,b) ((a)>(b))?(a):(b)
之后,您的陈述
printf("max(0,1)+1 = %d \n",max(0,1)+1);
printf("max(1,0)+1 = %d \n",(max(1,0)+1));
看起来像
printf("max(0,1)+1 = %d \n",0 > 1 ? 0: (1+1));
printf("max(1,0)+1 = %d \n",(1 > 0 ? 1: (0+1)));