为什么不是&&和&运营商评估?

时间:2014-10-20 07:47:09

标签: java

小疑问。为什么输出以下代码1?为什么不3

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

4 个答案:

答案 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 && anythingfalse&&是短路运算符,因此它不会评估((i+=2)部分,因为左侧是false。因此i将保持1

试着改变

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

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

现在你将获得3

这是short circuitnon 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,则无需评估该语句的其余部分,因为&&的定义pq必须为true )。如果p不成立,那么该陈述可能不是真的。