2015-08-24 16 views
0

Oracle Java Docs它提到& &運算符具有更高的優先於||。運營商。&&運算符真的比||更優先運營商?看看代碼

請看下面的代碼:

class TestLogicalOperators 
{ 
public static void main(String... args) 
{ 

    if(doFalse() || doTrue1() && doTrue2()) 
    { 
     System.out.println(true+" inside if"); 
    } 

} 

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

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

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

}

輸出是:
doFalse
doTrue1
doTrue2
真正內如果

現在,如果& &運算符優先於||運算符不應在doFalse()之前先評估doTrue1()和doTrue2()方法嗎?

+1

運算符優先級爲** not **評估順序。這是如何解析表達式 –

回答

4

&&操作的優先級,只要表達:

doFalse() || doTrue1() && doTrue2()

...也可以被解讀爲:

doFalse() || (doTrue1() && doTrue2())(注意括號)。

這並不意味着&&表達式將在之前被評估,您的表達式仍然從左到右進行評估。

如果第一個操作數是true,則||運算符可以是快捷方式(即不評估第二個操作數)。

參見下例:

// no shortcut, evaluates (true && false) and returns false anyway 
System.out.println(false || true && false); 
// no shortcut, evaluates (true && true) and returns true 
System.out.println(false || true && true); 
// shortcut (see warning), evaluates true and disregards "&&" expression 
System.out.println(true || false && false); 
0

NO,通常的第一條件或操作首先被執行。如果評估爲錯誤,則進一步檢查第二個條件。 否則它不。

+0

而原因是..... –

+0

@sᴜʀᴇsʜᴀᴛᴛᴀ想添加一些東西嗎? – SacJn

0

運營商&&has preference超過||但評估從左至右仍然存在,並已precedende了運營商在JLS §15.7

Java編程語言擔保描述了運營商的操作數出現在一個特定的待評估評估順序,即從左到右。

1

您錯誤地理解了文檔。這並不意味着&&運營商將首先執行,它只是說,延伸到&&的條件優先於優先級較低的其他條件。

在你的例子中你可以注意到編譯器正在從左到右檢查if語句的條件。

如果我們將straigt去從左至右的條件是:(注意括號)

if((doFalse() || doTrue1()) && doTrue2()) 
{ 
    //This means either doFalse or doTrue1 would be true and doTrue2 would be true 
} 

但由於&&操作的優先級是在||操作的是正確地讀取高過as

if(doFalse() || (doTrue1() && doTrue2())) 
{ 
    //This correctly means either doFalse is true or doTrue1 and doTrue2 are true 
}