我在学习 C 语言中的逻辑运算符和条件时遇到了这个问题。
#include <stdio.h>
int main() {
int x = 3;
int y = 2;
int z = 3;
printf("Result #4 = %d\n", x++ <= 3 || y++ >= 2 && z++ != 3);
printf("x: %d y: %d z: %d\n", x, y, z);
return 0;
}
输出:
Result #4 = 1
x: 4 y: 2 z: 3
我不明白输出的最后一行。x、y、z 的值与我的理解不符。
以下是我的思路。
- 表达式 x++ <= 3 || y++ >= 2 && z++ != 3 将被评估为:x++ <= 3 || (y++ >= 2 && z++ != 3)。
- 然后,y++ >= 2 将为真并且 y 值将增加到 3。
- 然后,z++ != 3 将为假,并且 z 值将增加到 4。
- 由于整个条件为假,因此将评估 OR 条件的 RHS。
- 因此,x++ <= 3 将被评估为真,并且 x 将增加到 4。
- 整个条件将为真,因为 x++ <= 3 将被评估为真。
我试图找到这个问题的参考教科书或工作表,但没能找到。我在 StackOverflow 上做了一些研究,我不认为这是一种短路情况。如果是的话,我不明白为什么。
我能想到的唯一解释是,x 值将产生副作用(x 递增),因为它被评估为真,而 OR 语句的其余部分将不会产生副作用,因为它被评估为假,因此 y 和 z 不会递增。是这样吗?