Java OR operator precedence

64,313

Solution 1

The Java || operator (logical or operator) does not evaluate additional arguments if the left operand is true. If you wanted to do that, you can use | (bitwise or operator), although, according to the name, this is a little of a hack.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.23

Thus, && computes the same result as & on boolean operands. It differs only in that the right-hand operand expression is evaluated conditionally rather than always.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.24

Thus, || computes the same result as | on boolean or Boolean operands. It differs only in that the right-hand operand expression is evaluated conditionally rather than always.

Extra: it is considered bad programming style to depend on these semantics to conditionally call code with side effects.

Solution 2

c won't be checked. To prove this, you can use the following code:

boolean a() {
  System.out.println("a")
  return false;
}

boolean b() {
  System.out.println("b")
  return true;
}

boolean c() {
  System.out.println("c")
  return true;
}

void test() {
  if(a() || b() || c()) {
    System.out.println("done")
  }
}

The output will be:

a
b
done

Solution 3

if (a || b || c)

for you case,

a is true then b and c not checked.

a is false and b is true then c not checked.

a and b are false then c is checked.

the left side of the operator is evaluated first

Share:
64,313
Szymon Toda
Author by

Szymon Toda

http://ah.fm/player ( ◕ ‿ ↼ )

Updated on July 27, 2022

Comments

  • Szymon Toda
    Szymon Toda almost 2 years

    How to chain conditional statements in Java in a way that if b is false, than do not check c?

    If a and c are false, and b is true, does c will be checked?

    if (a || b || c)
    

    I am looking for similar feature that PHP holds with difference between OR and ||

  • Szymon Toda
    Szymon Toda over 10 years
    Sometimes it's needed if you want to squeeze performance out of your program
  • Silly Freak
    Silly Freak over 10 years
    ah, I thought you were talking about if(isAlright || doSomething()) ... and not about if(firstCondition || expensiveSecondCondition()) .... The first is a method with side effects, the second is just an expensive function without side effect. I'd say that the second one is fine anyway.
  • Szymon Toda
    Szymon Toda over 10 years
    Still it's shady and not readable-frendly but still sometimes you just have to meet the specs ;-)