在C语言中的决策制定 - 三目运算符示例

3

我知道运算符的作用,但是我不理解下面代码中第二个情况为什么会返回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)视为“1<1+1吗?”,我认为应该是“1<1吗?不是的”,执行表达式3,我们得到:b = 1 + 1 = 2。这是因为上面的宏定义中a和b周围没有括号,或者可能是因为我在遵循自己的规则,感到迷失了?请帮忙解决...

另外,你如何解释这种情况:

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

8
在宏定义中使用括号。#define MIN(a,b) (((a)<(b)) ? (a):(b)) - J...S
2个回答

8
你的第二个案例
 MIN(1,1+1); 

扩展为

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

由于 1<1+1 的值为真,因此上述表达式的结果为 1

该语句

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

扩展后的结果在

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

+ 操作符比三目运算符 :? 优先级更高,因此下面的表达式实际上等同于

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

3

编译器不应该将(case 2)视为"is 1<1+1?"吗?我认为应该是"is 1<1? 不是的"

不是。"+"比"<"具有更高的优先级(它们都比"?:"具有更高的优先级)。语句为:

1 < 1 + 1 ? 1 : 1 + 1

与……相同

(1 < (1 + 1)) ? 1 : (1 + 1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接