Why is the output different in case of &&, &,

Here is the code segments

Can you explain why outputs are varying

1)

public static ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t && ((i++) == 0));
        b = (f && ((i+=2) > 0));
        System.out.println(i);      
    }
}

output in this case is 1

2)

public static ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t & ((i++) == 0));
        b = (f & ((i+=2) > 0));
        System.out.println(i);      
    }
}

output in this case is 3

3)

public static ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t || ((i++) == 0));
        b = (f || ((i+=2) > 0));
        System.out.println(i);      
    }
}

output in this case is 2

4)

public static ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t | ((i++) == 0));
        b = (f | ((i+=2) > 0));
        System.out.println(i);      
    }
}

output in this case is 3


Why is the output different in case of &&, &, || ?

Just as in C/C++ && is evaluated "lazily" while & is not.

If a is false then a && b will return false without even evaluating b .

Same goes for a || b a || b : If the first operand, a is true, the whole expression is true and the second operand, b is never evaluated. For a | b a | b however, both a and b will be evaluated.

This has consequences if the operand that's not being evaluated when using && (or || ) has side effects, as in your examples.


Side note: Few java-programmers know that ^ (xor) works for booleans as well. (A ^^ version does not exist simply because it would be redundant.)


There are 4 boolean binary operators that we're concerned with here:

  • && is the conditional and operator
  • & is the logical and operator
  • || is the conditional or operator
  • | is the logical or operator
  • Here's the key point:

  • "conditional" means it short-circuits: it does not evaluate the right operand if it will not affect the result of the operation
  • "logical" does not short-circuit: it evaluates both operands, left first, then right.
  • The result of "and" is true only if both operands are true
  • If the left operand is false , the result is false regardless of right operand
  • The result of "or" is true only if at least one operand is true
  • If the left operand is true , the result is true regardless of right operand
  • In other words, assuming no exception etc:

  • & and | always evaluate both operands
  • && and || evaluate the right operand conditionally; the right operand is evaluated only if its value could affect the result of the binary operation. That means that the right operand is NOT evaluated when:
  • The left operand of && evaluates to false
  • (because no matter what the right operand evaluates to, the entire expression is false )
  • The left operand of || evaluates to true
  • (because no matter what the right operand evaluates to, the entire expression is true )
  • References

  • JLS 15.22.2 Boolean Logical Operators & , ^ , and |
  • For & , the result value is true if both operand values are true ; otherwise, the result is false .
  • For | , the result value is false if both operand values are false ; otherwise, the result is true .
  • JLS 15.23 Conditional-And Operator &&
  • The && operator is like & , but evaluates its right-hand operand only if the value of its left-hand operand is true .
  • JLS 15.24 15.24 Conditional-Or Operator ||
  • The || operator is like | , but evaluates its right-hand operand only if the value of its left-hand operand is false .
  • See also

  • JLS 15.22.1 Integer Bitwise Operators & , ^ , and |
  • Related questions

  • What's the difference between | and || in Java?
  • Do &= and |= short-circuit in Java? (NO!)
  • Shortcut "or-assignment" ( |= ) operator in Java
  • Why doesn't Java have &&= or ||= ?

  • && and || are the logical AND and OR operators, they always result in a boolean expression. & and | are bitwise AND and OR operators, they do a bitwise comparison of each side. For more information about what those operators do, see this link

    链接地址: http://www.djcxy.com/p/73914.html

    上一篇: 相当于Delphi的Java

    下一篇: &&,&为什么输出不同?