簡體   English   中英

為什么這不短路?

[英]Why does this not short circuit?

public static void main(String args[]){
    String s = null;

    if(false && false || s.equalsIgnoreCase("x")) {    //throws an exception
        System.out.println("true");
    } else {
        System.out.println("false");
    }
}

我原以為這會遇到短路故障,但事實並非如此。 這是為什么? 我假設如果您有錯誤,則無需繼續下一個&&。 請幫助我理解。

因為這:

a && b || c

等效於此:

(a && b) || c

||的lhs 為假,因此對c求值。

&&運算符的優先級高於|| 操作員 因此,條件等於

if( (false && false) || s.equalsIgnoreCase("x")) {    //throws an exception

然后評估離開:

if(false || s.equalsIgnoreCase("x")) {    //throws an exception

這不會短路。 要使其短路,請使用括號:

if(false && (false || s.equalsIgnoreCase("x"))) {    // fine

和具有較高的優先級,因此將其括起來

((false && false) || s.equalsIgnoreCase("x"))

(false && false)減少為false ,不會因||短路


值得記住的是, &有點像*1 & 1 = 10 * 1 = 1 ),而+有點像| 因此&具有更高的優先級。 在數學中,有時+用作or,而&* 邏輯運算的優先級與二進制運算的優先級相同,因此&&優先級高於||

為什么要短路? || 僅當LH操作數為true時才短路。 如果LH操作數為false,則&&短路。 在這里,您有一個短路&&和一個非短路||。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM