2014-10-20 39 views
1

小疑问。为什么是以下代码1的输出?为什么不是3为什么不评估&&操作符的右侧?

int i = 0; 
boolean t = true, f = false, b; 
b = (t && ((i++) == 0)); 
b = (f && ((i+=2) > 0)); 
System.out.println(i); 

回答

6

条件 - 和运营商 - && - 是短路。如果左操作数为假,它不评估右操作数。这就是为什么((i+=2) > 0)从不评价,并i保持为1

JLS 15.23

的& &操作就像&(§15.22.2),但评估其右边的操作数只有当其左手操作数的值为真。

+0

你没有想到这个问题是重复的吗? – Raedwald 2014-10-22 07:01:24

+0

@Raedwald我没有时间搜索其他人提出的问题的重复,所以我只关闭重复,如果我知道这是一个重复的具体问题。否则,回答往往需要更少的时间。 – Eran 2014-10-22 07:04:38

2

这里的情况

b = (f && ((i+=2) > 0)); // here f is false 

现在false && anythingfalse&&是短路操作人员,所以它不会评估((i+=2)部分,因为左边的是false。所以i仍将1

只是试图改变

b = (f && ((i+=2) > 0)); 

b = (f & ((i+=2) > 0));// non short circuit 

现在你会得到3

这是short circuitnon short circuitAND的两种不同行为。

欲了解更多info

+0

非常感谢... – Leo 2014-10-20 07:57:59

+0

@Leo欢迎您 – 2014-10-20 07:58:55

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; 
     } 
    } 
0

例如:

if(p && q){ 
// do something 
} 

如果p正在评估因为&&pq必须为真)的定义,所以不需要评估其余的声明。如果p不是真的,那么该陈述不可能是真实的。

相关问题