2016-10-04 66 views
-1

我正在學習Java中的運算符,我遇到了一個我無法解決的問題。Java中的運算符

public static boolean first(){ 
     System.out.println("first"); 
     return true; 
    } 
    public static boolean second(){ 
     System.out.println("second"); 
     return true; 
    } 
    public static boolean third(){ 
     System.out.println("third"); 
     return true; 
    } 
    public static void main(String[] args) { 
     if(first() && second() | third()){ 
      //Do something 
     } 
    } 

輸出是「第一二三」。我認爲它應該是「第三第一」,因爲|大於& &。我不知道我的錯誤在哪裏,但顯然有一個。

+1

'if(first()&& second()|| third()){' –

回答

2

不要將運營商優先級與評估訂單混淆。 Java always evaluates expressions left-to-right

Java編程語言保證操作符的操作數看起來是以特定的評估順序(即從左到右)進行評估的。

所以,輸出爲:

first 
second 
third 

因爲順序的,該方法調用是在表達:

first() && second() | third() 

實際使用的運算符(&&|||)與訂單無關。選擇不同的操作符可能會導致某些行不被打印,但打印的行將按此順序排列。

1

first() && second() | third()被評估爲first() && (second() | third())歸因於運算符優先級。評估從左到右進行,因此首先評估first(),然後再評估(second() | third())。在評估這後一項時,兩個自變量都被評估(再次從左開始),因爲first()true,並且存在沒有短路的|算子。

您的意思是使用單一的|

較不特異的​​被評估爲(first() && second()) || third()。因爲first()返回true,所以在這種情況下(並按此順序)評估first()second()。由於second()也返回truethird()而不是進行評估。

+0

我認爲評估順序比優先或短路更重要。 OP期望(並看到)評估所有三種表達式;它似乎是他們沒有預料到的評估順序。 –