2

我运行以下 C 程序

#include <stdio.h>

int main() {
    int x = 5, y = 6, z = 3, i;
    i = y > x > z;
    printf("%d\n", i);
}

并将输出作为0. 再次,当我跑步时

 #include <stdio.h>

 int main() {
     int x = 5, y = 6, z = 3, i;
     i = y > x && x > z;
     printf("%d\n", i);
 }

我得到输出为1. 谁能解释这背后的逻辑?

4

2 回答 2

10

关系运算符从左到右关联。因此i = y > x > z;将被解析为

i = ( (y > x) > z ) => ( (6 > 5) > 3 ) => ( 1 > 3 ) => 0

并将i = y > x && x > z;被解析为

i = (y > x) && (x > z) => (6 > 5) && (5 > 3) => 1 && 1 => 1 

也就是说,在 Cy > x > z中不检查是否x大于z和小于y。但y > x && x > z确实如此。


请注意,如果操作数之间的关系是 or ,则关系运算符会返回0or或。1falsetrue

于 2017-05-09T12:18:05.173 回答
1
i = y > x > z;

在第一个示例中,>运算符从左到右的关联性,因此,首先解析y > x并给出布尔结果。

y > x = 6 > 5 = True

然后,

1(True) > 3 = False

所以,输出0

其次,

i = y > x && x > z;

>运算符的优先级高于运算&&符。因此,首先解析y > x并 if 条件为True,然后检查x > z.

于 2017-05-09T12:35:18.797 回答