小疑问。为什么是以下代码1
的输出?为什么不是3
?为什么不评估&&操作符的右侧?
int i = 0;
boolean t = true, f = false, b;
b = (t && ((i++) == 0));
b = (f && ((i+=2) > 0));
System.out.println(i);
小疑问。为什么是以下代码1
的输出?为什么不是3
?为什么不评估&&操作符的右侧?
int i = 0;
boolean t = true, f = false, b;
b = (t && ((i++) == 0));
b = (f && ((i+=2) > 0));
System.out.println(i);
条件 - 和运营商 - &&
- 是短路。如果左操作数为假,它不评估右操作数。这就是为什么((i+=2) > 0)
从不评价,并i
保持为1
的& &操作就像&(§15.22.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。
非常感谢... – Leo 2014-10-20 07:57:59
@Leo欢迎您 – 2014-10-20 07:58:55
同意发布的答案为&&
负责此操作。
你应该在这里指出,你的发言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;
}
}
例如:
if(p && q){
// do something
}
如果p
正在评估因为&&
(p
和q
必须为真)的定义,所以不需要评估其余的声明。如果p
不是真的,那么该陈述不可能是真实的。
你没有想到这个问题是重复的吗? – Raedwald 2014-10-22 07:01:24
@Raedwald我没有时间搜索其他人提出的问题的重复,所以我只关闭重复,如果我知道这是一个重复的具体问题。否则,回答往往需要更少的时间。 – Eran 2014-10-22 07:04:38