2010-02-15 89 views
46

我們來看一個簡單的對象Cat的例子。我想確保「非空」cat是橙色或灰色。在Java中,布爾「操作順序」是什麼?

if(cat != null && cat.getColor() == "orange" || cat.getColor() == "grey") { 
//do stuff 
} 

我相信AND先到先,然後是OR。我有點模糊了,所以這裏是我的問題:

  1. 有人能走我走過這個說法,所以我敢肯定,我得到了什麼情況?

  2. 另外,如果我添加括號會發生什麼;這是否會改變操作的順序?

  3. 我的操作順序是否會因語言而改變?

+11

如果您完全模糊,請添加圓括號,以便顯而易見。 – 2010-02-15 02:02:08

+34

即使對您來說不是很模糊,也可以添加括號以便其他人也能理解。 – 2010-02-15 02:05:45

+2

關於布爾邏輯的維基百科:在這種情況下[含糊不清],括號可以用來闡明操作順序。一如既往,最內層對內的操作首先執行,然後是下一對外操作等,直到圓括號內的所有操作都完成爲止。然後執行括號外的任何操作。 – Stephano 2010-02-15 02:15:25

回答

54

Java教程有一個列表,說明operator precedence。平等運營商將首先被評估,然後&&,然後||。括號將在其他任何事情之前進行評估,因此添加它們可以更改順序。從語言到語言,這通常是幾乎相同的,但仔細檢查總是一個好主意。

這是行爲中的小變化,您並不期望這可能會導致您花費一整天的時間進行調試,所以最好將括號放在適當的位置,以便確定評估順序是什麼。

+1

@VinceEmigh操作數不必與運算符優先級的順序相同。即使添加了括號,程序仍然可以看到if(true ||(true && s.equals(「」)))總是「true」,所以它不需要評估s.equals (「」)'。 – 2015-10-06 02:04:08

+0

我的不好,我剛剛意識到我錯了。我沒有正確地考慮優先權。我在考慮評估(首先得到評估),就像運營商「擁有」布爾值一樣 – 2015-10-06 02:59:57

14

操作的布爾順序(在所有的語言,我相信):

  1. 括號

所以你的邏輯之上,相當於到:

(cat != null && cat.getColor() == "orange") || cat.getColor() == "grey" 
4

首先,你的if語句包含三個主要表現:

  1. 貓= NULL
  2. cat.getColor()== 「橙色」
  3. cat.getColor()==「灰色! 「

第一個表達式只是檢查cat是否不爲null。否則必須執行第二個表達式,並且將導致NPE(null pointer excpetion)。這就是爲什麼在第一和第二表達式之間使用& &。當您使用&&時,如果第一個表達式的計算結果爲false,則不會執行第二個表達式。 最後你檢查貓的顏色是否是灰色的。

最後請注意,你的if語句是 仍然錯誤因爲如果貓是 空,則第三個表達式仍然 執行,因此你會得到一個空 指針異常

做的正確的方法是:

if(cat != null && (cat.getColor() == "orange" || cat.getColor() == "grey")) { 
//do stuff 
} 

檢查括號的順序。

8

表達基本相同:

if ((cat != null && cat.getColor() == "orange") || cat.getColor() == "grey") { 
    ... 
} 

優先級順序這裏是AND(&&)的優先級高於OR(||)。

你也應該知道,使用==來測試字符串等於有時工作在Java中,但它不是你應該這樣做。你應該這樣做:

if (cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) { 
    ... 
} 

即使用equals()方法String比較,不==它只是做參考平等。字符串的引用相等可能會引起誤解。例如:

String a = new String("hello"); 
String b = new String("hello"); 
System.out.println(a == b); // false 
+0

我認爲你在第一個例子中缺少一個paren,或者我太累了。 – 2010-02-15 02:28:04

+0

@羅伯特:他們搞砸了。修正了,謝謝。 – cletus 2010-02-15 02:51:43

3

是的&&肯定是在||之前評估過的。但我看到你正在做cat.getColor() == "orange"這可能會給你意想不到的結果。你可能想要這個:

if(cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) { 
    //do stuff 
} 
-2

操作順序是不是你所需要的,你需要布爾代數,這包括布爾函數。你需要的是在計算機或虛擬機上實現布爾「邏輯」。你需要的是在計算機或虛擬機上實現布爾「邏輯」。有了「操作順序」,你可以參考一些有關物理的內容,比如管理邏輯門上的延遲(OR,如果)納秒間隔?