#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;
}
如果我使用||,k的值会增加运营商,但在&amp;&amp;价值没有增加的原因是什么,我很困惑。
输出为-2,3,0,1
答案 0 :(得分:4)
您的代码中有测试:
m = ++i && ++j || ++k;
当您使用这样的多个测试时,您将首先评估++i && ++j
。如果这是真的,那么永远不会评估|| ++k
部分(因为m
无论如何都是真的)。这称为lazy evaluation。
如果您的示例中++i && ++j
为假,则k
会增加,因为测试的最后部分会被评估。
答案 1 :(得分:2)
它被称为懒惰评估。虚假&amp;&amp;无论b是什么,b总是假的。
在你的情况下:
m = ++i && ++j || ++k;
评估为m = true || ++k;
,导致++k
因懒惰而未被评估。
答案 2 :(得分:2)
因为++k
未评估为++i && ++j
,所以评估为真。
答案 3 :(得分:2)
如果“&amp;&amp;”的运算符不为零,它将成为现实,则其余部分将不会被使用。 在c中,如果它不为零,则确实如此。
答案 4 :(得分:1)
OR条件被懒惰地评估。
++k
永远不会被执行,因为条件的第一部分不是真的。
答案 5 :(得分:1)
1之后的表达式,当它之前的值评估为true时,将不会对其进行求值。
||
在此示例中,(c=10)|| (y=20)
评估为c=10
,因为true
将不会被评估。