1.布爾運算

|and運算符&不僅可以應用於數字,還可以應用於布爾表達式。

但是,如您所知,有&&and||運算符。為什麼我們要使用|instead of||&instead of &&?這有什麼意義嗎?好像有。有時。

和邏輯運算符遵循所謂的惰性原則從左到右執行||&&

(expression1) || (expression2) || (expression3)

如果expression1 等於,則評估 andtrue沒有意義:不管結果如何。expression2expression3true

因此,在評估表達式時(它們是從左到右評估的),一旦我們得到true就會跳過對其餘表達式的評估。如果expression2 包含expression3方法調用,則不會調用這些方法

邏輯運算符也是如此&&

(expression1) && (expression2) && (expression3)

如果expression1等於,則評估andfalse沒有意義:不管結果如何。expression2expression3false

這是一個重要的事實,可以讓您編寫如下內容:

String s = null;
if (s != null && s.length() > 0) {

上面的例子永遠不會給你一個NullPointerException,因為s.length()只有當第一部分s! = nulltrue.

如果s等於null,運算符左邊的部分&&false,那麼整個布爾表達式的結果是false,所以右邊的 ( s.length() > 0) 部分不被計算。

總而言之:

如果你使用|operator 或&operator,那麼就沒有惰性求值:每個子表達式都會被求值。



2. Java中的操作優先級

您可能還記得在高中數學課上,乘法運算符的優先級高於加法運算符。括號的優先級更高:首先計算括號中的表達式,然後是乘法和除法,然後是加法和減法。

Java 中的運算符也有優先順序。不同之處在於 a) 它們的數量稍微多一些,b) 對於某些運算符,操作數是從左到右計算的,而對於其他操作符 - 從右到左計算。

這是一張包含所有 Java 運算符的表格:

類別 操作員 關聯的
後綴 () [] . 從左到右
一元 ++ -- ! ~ 右到左
乘法 * / % 從左到右
添加劑 + - 從左到右
轉移 >> >>> << 從左到右
關係型 > >= < <= 從左到右
平等 == != 從左到右
按位AND & 從左到右
Exclusive OR(異或) ^ 從左到右
按位OR | 從左到右
合乎邏輯AND && 從左到右
合乎邏輯OR || 從左到右
有條件的 ?: 右到左
任務 = += -= *= /= %= >>= <<= &= ^= |= 右到左
逗號 , 從左到右

頂行包含具有最高優先級的運算符。括號()用於明確設置優先級。方括號[]用於訪問數組變量特定索引處的元素。點運算符 ( .) 用於使用對對像或類的引用來訪問字段和方法。

運算符在表中越靠下,它們的優先級就越低。

如果您在一個表達式中使用多個運算符,請不要偷懶:添加括號。

在 Java 中,您可以編寫類似於 的內容if (a & 1<< b > ~c),但您不應該這樣做。您不僅要為編譯器編寫代碼,還要為其他程序員編寫代碼。代碼的可讀性越高越好。



3. 前綴和後綴遞增

如您所知,Java 有一個遞增運算符 ( ++) 和一個遞減運算符 ( --)。它們分別將變量的值增加和減少1.

您可能不知道的是,這些運算符有兩種類型:前綴(運算符位於變量之前)和後綴(運算符位於變量之後)。兩種運算符的工作方式略有不同。

在 Java 中,您可以編寫如下表達式:

int a = 5;
int b = a++;

如果++運算符出現在變量之後並且變量是某個表達式的一部分(如上例所示),則表達式將使用變量的當前值,並且只有在之後變量才會增加1.

換句話說,會發生這樣的事情:

int a = 5;
int b = a;
a = a + 1;

也就是說,bwill be 5,並不6像你乍一看所想的那樣。

如果++運算符在變量之前並且變量是某個表達式的一部分,它會首先增加1,然後它的值才會在表達式中使用。

int a = 5;
int b = ++a;

上面的例子等同於下面的例子:

int a = 5;
a = a + 1;
int b = a;

在這裡,b將等於6

甚至有一個 Java 程序員用來判斷其他人是否也是 Java 程序員的例子:

int a = 5;
int b = ++a++a;

是的,你也可以這樣寫。

這個例子將編譯得很好並變成這樣的東西:

int a = 5;

a = a + 1;
int v1 = a;

a = a + 1;
int v2 = a;

int b = v1 + v2;

對於--運營商來說,一切都如出一轍。