2012-01-17 70 views
1

我有一段代碼如下一樣爲什麼意外行爲爲條件運算

​​

輸出爲false。如果你使用的是Eclipse,你會得到一個波浪形(這裏是虛線)並且警告像「比較相同的表達式」。注意波浪線的開始。

我改變了代碼爲以下

   public class Test{ 
       public static void main(String[] args) { 
        System.out.println((true?false:true) == (true?false:true)); 
            --------------------------------------- 
       } 
      } 

輸出是true。如果你使用的是Eclipse,你會得到一個波浪形(這裏是虛線)並且警告像「比較相同的表達式」。現在注意波浪線的開始。

爲什麼區別?

+0

我不確定你的問題是什麼。正如消息所說,你正在比較兩個相同的表達式。你期望發生什麼? – 2012-01-17 20:17:46

+2

我不需要短暫的時間。沒有竅門。 – Nanne 2012-01-17 20:19:05

+0

看到最後的結果。它在兩種情況下都是差異 – 2012-01-17 20:21:31

回答

1

如果您的問題是結果的差異,這是因爲您使用的操作符的優先順序。詳情請查詢here。根據優先順序:

true ? false : true == true ? false : true 

是一樣的:

true ? false : ((true == true) ? false : true) 

所以它總是爲。你可以把任何東西放在冒號後面,因爲它從來沒有被評估(如果我沒有記錯,三元操作符使用懶惰評估);這樣做的原因是,

true ? A : B 

始終計算爲A.


在另一方面,

(true ? false : true) == (true ? false : true) 

將有比較操作符兩邊都是==值爲false ,所以

false == false 

這是一個聲明。

所以這裏的區別是操作符被評估的順序,這是由你使用的圓括號決定的,如果有不明確的地方不能被圓括號解決,那麼這些操作符的優先順序是用過的。


一般情況下,三元運算符 「?:」 是這樣的

A ? B : C 

如果A爲真,評估爲B,否則評估爲C. A必須是一個布爾表達式,B C可以是任何你想要的;你必須處理類型不匹配,儘管如果你想分配評估值給一個變量並且它們是不同類型的。

1

這是因爲條件相等運算符(==)優先於三元條件?:。因此,在a?b:xy?z:t之前評估a?b:x==y?z:tx==y?z:t

3

由於三元運算符(?:)比等號運算符(==)的priority更低。這意味着:

true?false:true == true?false:true 

實際上是解釋爲:

​​

這,輪流,被評估爲:

true?false:((true == true)?false:true) 

續:

true?false:(true?false:true) 

。最終:

true?false:(false) 

,並最終:

true?false:false 

而且很明顯這解釋了第一個代碼段的輸出。 Eclipse正確識別運算符優先級並突出顯示可能不正確的語句

UPDATE:感謝您的所有意見。事實上,我忘記了左側的運算符優先級。

public static boolean a(char label, boolean result) { 
    System.out.println(label); 
    return result; 
} 

public static void main(String[] args) { 
    System.out.println(
     a('a', true) ? a('b', false) : a('c', true) == a('d', true) ? a('e', false) : a('f', true) 
    ); 
} 

結果與@Milad Naseri建議是一致的:我使用下面的程序檢查的確切行爲。

+0

爲什麼(true == true?false:true)在步驟1中減少爲(true == false)。我想你在這裏違反了你在第一行中談到的優先順序。只是一個想法.. – 2012-01-17 20:26:08

+1

@Tomasz Nurkiewicz,Saurabh庫馬爾是正確的那一個;第三步沒有冒號評估後的部分(true == false),它只是計算爲(false)。 – 2012-01-17 20:30:24

+1

'(true == true?false:true)'在步驟3中評估爲'(true == true)?false:true',其變爲'true?false:true',最終變爲'false',導致第四步:'true?false:false'。 – 2012-01-17 20:35:25

2

這裏沒有什麼意外的,答案是運算符優先級。 在第一種情況下,它是:
true?false:(true == true?false:true)
而在第二種情況下,您的遺傳項會覆蓋優先規則。