C中的决策 - ? :运算符示例

时间:2017-08-10 10:22:44

标签: c c-preprocessor ternary-operator

我知道运算符是如何工作的,但我不明白下面代码中的第二种情况如何给出1作为结果。

#define MIN(a,b) a<b ? a:b  
int x = MIN(1,2);  //case 1, output is 1
int x = MIN(1,1+1); // case 2

编译器不应该看到这种情况(情况2)为&#34;是1&lt; 1 + 1?&#34;,我认为应该是&#34;是1&lt; 1?不,它不是&#34;,表达式3被执行,我们得到:&#34; b&#34; = 1 + 1 = 2.这是因为上面的宏中a和b周围没有括号,或者可能是因为我遵循自己的规则并感到迷茫?请帮助....

另外,你如何解释这个案例:

int x = MIN(1,2) + 1;  //should we consider the "1" on the right?

2 个答案:

答案 0 :(得分:8)

你的第二个案例

 MIN(1,1+1); 

扩展为

 1<1+1 ? 1:1+1;

由于1<1+1被评估为true,因此上面的表达式会产生1

声明

int x = MIN(1,2) + 1; 

扩展后

结果

int x = 1<2 ? 1:2 + 1;

运算符+的优先级高于三元运算符 :?,因此下面的表达式实际上相当于

1<2 ? 1:(2 + 1);

答案 1 :(得分:3)

  

编译器不应该将此(案例2)视为“1&lt; 1 + 1?”,我认为应该是“1&lt; 1?不是不是”

没有。 +的优先级高于<(两者的优先级均高于?:)。声明

1 < 1 + 1 ? 1 : 1 + 1

相同
(1 < (1 + 1)) ? 1 : (1 + 1)