小疑问。为什么输出以下代码1
?为什么不3
?
int i = 0;
boolean t = true, f = false, b;
b = (t && ((i++) == 0));
b = (f && ((i+=2) > 0));
System.out.println(i);
答案 0 :(得分:6)
Conditional-And运算符 - &&
- 是短路的。如果左操作数为false,则不评估右操作数。这就是永远不会评估((i+=2) > 0)
的原因,i
仍为1。
来自JLS 15.23:
&&运营商就像& (§15.22.2),但仅在其左侧操作数的值为真时才计算其右侧操作数。
答案 1 :(得分:2)
以下是案例
b = (f && ((i+=2) > 0)); // here f is false
现在false && anything
是false
。 &&
是短路运算符,因此它不会评估((i+=2)
部分,因为左侧是false
。因此i
将保持1
试着改变
b = (f && ((i+=2) > 0));
到
b = (f & ((i+=2) > 0));// non short circuit
现在你将获得3
。
这是short circuit
和non short circuit
AND
的两种不同行为。
了解更多info。
答案 2 :(得分:2)
同意发布的答案,&&
负责此事。
您应该在此注意,您的陈述b = (t && ((i++) == 0));
等同于
if(t){
if(i++==0){
b=true;
}
}
和第二个陈述b = (f && ((i+=2) > 0));
等同于
if(f==true){
i=i+2;
if(i>0){
b=true;
}
}
答案 3 :(得分:0)
例如:
if(p && q){
// do something
}
如果p
被评估为false,则无需评估该语句的其余部分,因为&&
的定义p
和q
必须为true )。如果p
不成立,那么该陈述可能不是真的。