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 可以是 0
或 1
,具体取决于操作数之间的关系是 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
.
我运行下面的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 可以是 0
或 1
,具体取决于操作数之间的关系是 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
.