与括号一起使用时宏的行为会发生变化

时间:2014-01-27 14:57:57

标签: c macros

为什么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))

3 个答案:

答案 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)) + 12

答案 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)));