为什么K的值在这段代码中没有增加?

时间:2012-11-02 09:02:37

标签: c

#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

6 个答案:

答案 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将不会被评估。