3

这里是 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

谢谢!

4

4 回答 4

8

因为不需要评价。

checkbit = i < j || ++j < k;

i < jwill yield true,所以无论表达式的第二部分产生什么,checkbitwill 的值都是true。因此,它甚至不会费心评估它。


只是为了踢球:

checkbit = i > j && ++j < k;

在这种情况下,不会计算第二个表达式,因为false && (expr)is false

于 2013-06-04T20:44:22.087 回答
5

双或是“捷径” - 如果第一部分为真,它将不会评估表达式的其余部分。无论发生什么,都使用单或来增加它。

这有时很有用。它加快了执行速度,因为如果第一部分为真,您就知道结果or必须为真!

请注意,这与以下情况相同(相反)&&:如果 && 的第一部分为假,则第二部分被忽略,因为您知道结果将为假。

于 2013-06-04T20:44:13.730 回答
3

或许值得一提的是,这种行为,即短路评估,在 C 标准中:

6.5.14 逻辑或运算符语法

1 逻辑或表达式:逻辑与表达式 逻辑或表达式 || 逻辑与表达式

约束

2 每个操作数应为标量类型。

语义

3 || 如果任一操作数比较不等于 0,则运算符应产生 1;否则,它产生 0。结果具有 int 类型。4 不同于按位 | 运算符,|| 运算符保证从左到右的评估;在对第一个操作数求值之后有一个序列点。如果第一个操作数比较不等于 0,则不计算第二个操作数。

(强调我的)

于 2013-06-04T20:48:30.103 回答
0

使用时|| 运算符,并且第一个条件的计算结果为真,它与 && 运算符不同,它忽略了其余的条件

 checkbit = i < j || ++j < k; //since i < j is true, it skips over ++j < k
于 2013-06-04T20:47:02.977 回答