C 在这个例子中,为什么j不增加?
C新手,我想知道,为什么在下面的例子中j不增加 我到处寻找解释C 在这个例子中,为什么j不增加?,c,C,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 5 5 谢谢 Double或is“Shortcutting”-如果第一部分为true,则不会计算表达式的其余部分。 无论发生什么情
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 5 5
谢谢 Double或is“Shortcutting”-如果第一部分为true,则不会计算表达式的其余部分。
无论发生什么情况,都可以使用单个或递增
这有时很有用。它加快了执行速度,因为如果第一部分为真,您就知道或的结果必须为真
请注意,这与&&&
相同(相反):如果&&的第一部分为false,则忽略第二部分,因为您知道结果将为false。,因为不需要对其进行计算
checkbit = i < j || ++j < k;
在这种情况下,将不计算第二个表达式,因为当使用| |运算符时,false&(expr)
是false
,并且第一个条件的计算结果为true,与&&运算符不同,它会忽略其余条件
checkbit = i < j || ++j < k; //since i < j is true, it skips over ++j < k
checkbit=i
也许值得一提的是,这种行为在C标准中:
6.5.14逻辑或运算符
语法
1逻辑或表达式:
逻辑与表达式
逻辑OR表达式| |逻辑AND表达式
约束条件
2每个操作数应具有标量类型
语义学
3如果| |运算符的任一操作数比较不等于0,则| |运算符应产生1;否则,
收益率为0。结果的类型为int。
4与按位|运算符不同,| |运算符保证从左到右求值;有
计算第一个操作数后的序列点如果第一个操作数比较
如果不等于0,则不计算第二个操作数。
(我的重点)因为你的逻辑,第一个语句是正确的,所以checkbit
变成1。@H2CO3@Kevin Damn。谢谢,我站直了。
checkbit = i > j && ++j < k;
checkbit = i < j || ++j < k; //since i < j is true, it skips over ++j < k