C 程序中的意外输出

Unexpected output in C program

我运行下面的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。谁能解释一下这背后的逻辑?

关系运算符与 left to right 关联。因此 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 

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


请注意,关系运算符 return 可以是 01,具体取决于操作数之间的关系是 false 还是 true

i = y > x > z;

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

y > x = 6 > 5 = True

然后,

1(True) > 3 = False

所以,输出0.

第二,

i = y > x && x > z;

> 运算符 优先级更高 然后 && 运算符。所以,首先解析 y > x 如果条件 True,然后检查 x > z.