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