HOWTO · Java
Java 中 `!=` 不等比較與 `=!` 指派加布林否定的差異
本文說明 Java 中 `!=` 不等比較運算子與 `=!` 指派搭配布林否定之字元序列的差異。
本頁內容
在 Java 中,!= 是不等比較運算子:當兩個運算元的值不同時,結果為 true。字元序列 =! 並不是運算子。在 a = !b 這類運算式中,Java 會將 = 解析為指派,將 ! 解析為布林否定,因此會把 b 否定後的值指派給 a。
以下範例會展示各種比較的布林結果,以及指派搭配否定如何影響條件判斷。
Java != 不等比較範例
使用 != 比較兩個值。兩者相等時結果為 false,不同時則為 true。對基本數值型別而言,它會比較值;對參考型別而言,它會比較兩個參考是否指向不同物件。若要否定相等比較,可以寫成 !(a == b),其布林結果與 a != b 相同。
這個運算子會產生布林值,因此可以直接用於 if 條件,也可以存入布林變數。例如,當兩個基本型別的值不同時,if (count != limit) 內的程式區塊就會執行。比較物件時,!= 檢查的是物件身分,而不是物件內容;兩個不同的 String 物件即使含有相同文字,依物件身分比較仍會是不相等。若要比較物件內容,請使用 equals。!(a == b) 中的括號能清楚表明運算順序:先判斷是否相等,再否定其結果。閱讀較長的條件式時,了解這種等價關係很有幫助,但通常 a != b 寫法較簡潔。
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 10;
System.out.println(a != b);
a = 20;
System.out.println(a != b);
System.out.println(!(a == b));
}
}
false
true
true
第一組值的比較結果為 false。a 改變後,兩個值不再相同,因此不等比較和否定後的相等比較結果都為 true。
Java =! 指派與否定範例
Java 沒有名為 =! 的合併運算子。在 a = !b 中,Java 會先計算 !b,再將布林結果指派給 a。同一個指派運算式也可以放在 if 條件中:條件會取得被指派的布林值,且該值為 true 時,程式區塊就會執行。這種寫法合法,但會在檢查條件時改變 a;若不需要指派,直接寫成 if (!b) 通常更容易閱讀。
指派運算子的優先順序低於一元否定,因此這個運算式會分組為 a = (!b)。指派運算式本身也有布林值,結果就是剛存入 a 的值。這就是 Java 接受它作為 if 條件的原因:條件並不是拿 a 與另一個值比較。若指派是刻意的,這種寫法可能很實用;但對預期看到比較運算的人來說,也可能令人意外。如果同時需要儲存一個值並另外進行測試,請先指派,再用另一個陳述式測試,讓這兩個動作一目了然。
public class Main {
public static void main(String[] args) {
boolean a;
boolean b = true;
a = !b;
System.out.println("a = " + a);
b = false;
if (a = !b) {
System.out.println("condition is true; a = " + a);
}
}
}
a = false
condition is true; a = true
當 b 為 true 時,!b 為 false,這個值會被指派給 a。之後,當 b 為 false 時,條件中的指派會將 true 存入 a;這個 true 值會使 if 程式區塊執行。將運算式寫成 a = !b,有助於看出指派與否定是兩個不同動作,但空白字元不會改變其意義。