问题描述
在逻辑运算符应用于其结果之前,复合逻辑 AND / OR 表达式中的单个表达式是否不应先被评估?为什么 ++ k
不变的条件 m = ++ i&& ++ j || ++ k
为以下程序:
Aren't the individual expressions in a composite logical AND/OR expression supposed to be evaluated first before the logical operators are applied to their result?Why is ++k
untouched in the condition m = ++i && ++j || ++k
for the following program :
#include<stdio.h>
int main()
{
int i=-3, j=2, k=0, m;
m = ++i && ++j || ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
return 0;
}
输出: -2,3,0, 1
Output : -2,3,0,1
但我预计输出 -2,3,1,1
推荐答案
你应该避免编码这样不可读的代码。它实际上被解析为
You should avoid coding such unreadable code. It is actually parsed as
m = (++i && ++j) || ++k;
所以一旦 j> = 0
++ j
条件始终为真,因此& &
是一个简短的,然后,但 ||
是一个简短的 / em>(所以他们可能不会评估他们的正确操作数)。
So once j >= 0
the ++j
condition is always true, so ++k
is not evaluated since &&
is a short-cutting and then but ||
is a short-cutting or else (so they may not evaluate their right operand).
所以&&
被评估为遵循:左操作数被评估,如果它是false它被返回,然后只有当它是真的(即不等于 0
)时,正确的操作数被评估和返回作为&&
的评估结果。同样 ||
的评估如下:左操作数被评估。如果它是真的(非零),它将成为 ||
的结果;否则正确的操作数被评估,并且是 ||
表达式的结果。
So &&
is evaluated as follow: the left operand is evaluated, if it is false it is returned, and then only when it is true (i.e. not equal to 0
) the right operand is evaluated and returned as the evaluated result of the &&
. Likewise ||
is evaluated as follow: the left operand is evaluated. If it is true (non-zero) it becomes the result of the ||
; or else the right operand is evaluated and is the result of the ||
expression.
特别是,当编码 if(x> 0&< 20 / x< 5)
从来没有为 x == 0
。
In particular, when coding if (x > 0 && 20/x < 5)
the division is never attempted for x==0
.
还阅读维基百科& & 页面;请花几个小时阅读一本好的C编程书。
Read also the wikipedia operators in C & C++ & short circuit evaluation & lazy evaluation pages; and please take several hours to read a good C programming book.
这篇关于为什么不是“k”在语句“m = ++ i&&&& ++ j || ++ K"当“++ i&& ++ j”评估为真?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!