这里是 C 新手,我想知道,为什么 j 在下面的示例中没有递增?
我到处寻找解释
int i, j, k;
i = 3; j=4; k=5;
_Bool checkbit;
checkbit = i < j || ++j < k;
printf("%d\n", checkbit );
printf("%d %d %d\n", i, j , k);
输出是
1
3 4 5
代替
1
3 5 5
谢谢!
这里是 C 新手,我想知道,为什么 j 在下面的示例中没有递增?
我到处寻找解释
int i, j, k;
i = 3; j=4; k=5;
_Bool checkbit;
checkbit = i < j || ++j < k;
printf("%d\n", checkbit );
printf("%d %d %d\n", i, j , k);
输出是
1
3 4 5
代替
1
3 5 5
谢谢!
因为不需要评价。
checkbit = i < j || ++j < k;
i < j
will yield true
,所以无论表达式的第二部分产生什么,checkbit
will 的值都是true
。因此,它甚至不会费心评估它。
只是为了踢球:
checkbit = i > j && ++j < k;
在这种情况下,不会计算第二个表达式,因为false && (expr)
is false
。
双或是“捷径” - 如果第一部分为真,它将不会评估表达式的其余部分。无论发生什么,都使用单或来增加它。
这有时很有用。它加快了执行速度,因为如果第一部分为真,您就知道结果or
必须为真!
请注意,这与以下情况相同(相反)&&
:如果 && 的第一部分为假,则第二部分被忽略,因为您知道结果将为假。
或许值得一提的是,这种行为,即短路评估,在 C 标准中:
6.5.14 逻辑或运算符语法
1 逻辑或表达式:逻辑与表达式 逻辑或表达式 || 逻辑与表达式
约束
2 每个操作数应为标量类型。
语义
3 || 如果任一操作数比较不等于 0,则运算符应产生 1;否则,它产生 0。结果具有 int 类型。4 不同于按位 | 运算符,|| 运算符保证从左到右的评估;在对第一个操作数求值之后有一个序列点。如果第一个操作数比较不等于 0,则不计算第二个操作数。
(强调我的)
使用时|| 运算符,并且第一个条件的计算结果为真,它与 && 运算符不同,它忽略了其余的条件
checkbit = i < j || ++j < k; //since i < j is true, it skips over ++j < k