Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在这个例子中,为什么j不增加?_C - Fatal编程技术网

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,则不会计算表达式的其余部分。 无论发生什么情

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,则不会计算表达式的其余部分。 无论发生什么情况,都可以使用单个或递增

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


请注意,这与
&&&
相同(相反):如果&&的第一部分为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