为什么在执行以下代码后j
的值为零?
int main()
{
int i = 0, j = 0;
if (i && (j = i + 10))
//do something ;
}
为什么值10
如果我替换逻辑和按位和?
另外,为什么在执行下面的代码后j的值再次为零?
int i = 10, j = 0;
if (i || (j = i + 10))
//do something
;
答案 0 :(得分:3)
因为逻辑和(&&
)短路。考虑:
a() && b() && c();
如果a()
返回false,则根据和操作的定义,整个结果将为false,因此无需计算b()
和{ {1}}(实际上,C不会执行c()
和b()
)。在您的情况下,c()
在注意到&&
(在C中为假)后放弃。
类似地,第一个表达式上的逻辑或(i == 0
)短路计算结果为true。考虑:
||
如果a() || b() || c()
仍然返回false(如前面的示例所示),但a()
返回true,则不会评估b()
,因为整个逻辑操作的值已经知道评估c()
。
Bitwise和(b()
)是完全不同于逻辑和。您使用逻辑和控制流(决定运行什么代码);您使用按位并计算位上的和操作。按位操作不像逻辑操作,它们更像是算术操作 - 它们的行为与例如&
或+
。
答案 1 :(得分:2)
将&&
短路视为以下内容会更容易:
int main()
{
int i = 0, j = 0;
if (i){
if(j = i + 10)){
//do something ;
}
}
}
这相当于你的例子。如果您按照提到的那样替换订单(j = i + 10) && i
,则等效性将如下所示:
int main()
{
int i = 0, j = 0;
if (j = i + 10){
if(i)){
//do something ;
}
}
}
您可以自己查看为什么j
的值在第一个代码块中为零,在第二个代码块中为十。
答案 2 :(得分:1)
因为i && (j = i + 10)
表示短路行为的逻辑AND操作。由于(j=i + 10)
是逻辑0(false),因此未评估i
。每个表达式必须求值为标量逻辑结果。
答案 3 :(得分:1)
j = i + 10
与j == i + 10
不同。前者为j
指定了值(在这种情况下为10
,因为i
为0
),后者将j
与i + 10
进行比较。< / p>
如果&&
j = i + 10
被忽略,因为它已知道i
为0,因此第一部分为false。当您将其设为&
时,它会查看&
运算符的两侧并为j
赋值。您可能会或可能不会尝试做什么 - 它不清楚您要对代码执行的操作。
答案 4 :(得分:1)
我更喜欢这样看:
if (A && B)
{
DoSomething();
}
与
相同if (A)
{
if (B) // So B is only evaluated when A results in TRUE
{
DoSomething();
}
}
和
if (A || B)
{
DoSomething();
}
与
相同if (A)
{
DoSomething();
}
else if (B) // So B is only evaluated when A results in FALSE
{
DoSomething();
}