What is wrong with the short circuit logic in this Java code?

后端 未结 9 1078
挽巷
挽巷 2021-01-18 01:58

Why doesn\'t func3 get executed in the program below? After func1, func2 doesn\'t need to get evaluated but for func3, shouldn\'t it?

if (func1() || func2()          


        
相关标签:
9条回答
  • 2021-01-18 02:13

    If you want all functions to be executed you can drop the short-cut variants

    if (func1() | func2() & func3()) {
    
    0 讨论(0)
  • 2021-01-18 02:18

    http://en.wikipedia.org/wiki/Short-circuit_evaluation

    0 讨论(0)
  • 2021-01-18 02:20

    You're using the shortcut-operators || and &&. These operators don't execute the rest of the expression, if the result is already defined. For || that means if the first expression is true and for && if the first expression is false.

    If you want to execute all parts of the expression use | and & instead, that is not shortcut.

    0 讨论(0)
  • 2021-01-18 02:23

    Java functions are evaluated according to precedence rules

    because "&&" is of higher precendence than "||", it is evaluated first because you did not have any brackets to set explicit precedence

    so you expression of

    (A || B && C) 
    

    which is

    (T || F && F)
    

    is bracketed as

    (T || (F && F)) 
    

    because of the precedence rules.

    Since the compiler understands that if 'A == true' it doesn't need to bother evaluating the rest of the expression, it stops after evaluating A.

    If you had bracketed ((A || B) && C) Then it would evaluate to false.

    EDIT

    Another way, as mentioned by other posters is to use "|" and "&" instead of "||" and "&&" because that stops the expression from shortcutting. However, because of the precedence rules, the end result will still be the same.

    0 讨论(0)
  • 2021-01-18 02:23

    Java short-circuits boolean expressions. That means that, once func1() is executed and returns true, the rest of that boolean doesn't matter since you are using an or operator. No matter what func2() && func3() evaluates to, the whole expression will evaluate to true. Thus, Java doesn't even bother evaluating the func2() or func3().

    0 讨论(0)
  • 2021-01-18 02:26

    You're using a short-circuited or. If the first argument is true, the entire expression is true.

    It might help if I add the implicit parentheses that the compiler uses

    Edit: As Chris Jester-Young noted, this is actually because logical operators have to left-to-right associativity:

    if (func1() || (func2() && func3()))
    

    After func1 returns, it becomes this:

    if (true || (func2() && func3()))
    

    After evaluating the short-circuited or, it becomes:

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