Java logical operator (&&, ||) short-circuit mechanism

后端 未结 6 2009
野的像风
野的像风 2021-02-19 06:28

As I was reading a colleague\'s Java code, I stumbled upon an army of if/else statements. In these statements, several && and || operators wer

相关标签:
6条回答
  • 2021-02-19 06:45

    It's simply because

    if (false && true || true)
    

    is equivalent to (&& has a higher precedence)

    if ((false && true) || true)
    

    which is

    if (false || true)
    

    which is... true.

    Note: In the expression true || true && false, the part true && false is called a dead code because it doesn't affect the final result of the evaluation, since true || anything is always true.


    It is worth mentioning that there exist & and | operators that can be applied to booleans, they are much like && and || except that they don't short circuit, meaning that if you have the following expression:

    if (someMethod() & anotherMethod())
    

    and someMethod returns false, anotherMethod will still be reached! But the if won't be executed because the final result will be evaluated to false.

    0 讨论(0)
  • 2021-02-19 06:51

    The && has higher operation precedence over the ||, thus it wins.

    0 讨论(0)
  • 2021-02-19 06:54

    for &&:

    false && ... => false

    for ||:

    true || ... => true.

    And precedence for && is higher than ||.

    See more: Operator Precedence in Java

    0 讨论(0)
  • 2021-02-19 06:56

    I see what you were trying to do, but before operating on parentheses it's good to have the language's specification handy. I've known a few programmers who have gone so far as to keep the important bits, like operator precedence, on their walls.

    The second part is to know whether your alterations are going to make any sense to the other people in your workplace; if removing parentheses compromises the meaning of an operation to someone else working on the code, then it could ultimately be detrimental.

    The optimizer will generally take care of it for you, so when in doubt, leave them in there.

    0 讨论(0)
  • 2021-02-19 07:01

    According to Java tutorials && has higher precedence over ||

    So your true || true && false would be evaluated as true || (true && false)

    And your false && true || true would be evaluated as (false && true) || true

    Resulting in an output of true in both case.

    0 讨论(0)
  • 2021-02-19 07:01

    Because of the precedence of && on ||, (true || true && false) this will be evaluated as (true || (true && false)) -> (true || (false)) -> true

    See the precedences rules: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

    0 讨论(0)
提交回复
热议问题