java運算子優先順序

程式碼女民工發表於2021-12-07

所有的數學運算都認為是從左向右運算的,Java 語言中大部分運算子也是從左向右結合的,只有單目運算子、賦值運算子和三目運算子例外,其中,單目運算子、賦值運算子和三目運算子是從右向左結合的,也就是從右向左運算。


乘法和加法是兩個可結合的運算,也就是說,這兩個運算子左右兩邊的運算元可以互換位置而不會影響結果。運算子有不同的優先順序,所謂優先順序就是在表示式運算中的運算順序。


一般而言,單目運算子優先順序較高,賦值運算子優先順序較低。算術運算子優先順序較高,關係和邏輯運算子優先順序較低。多數運算子具有左結合性,單目運算子、三目運算子、賦值運算子具有右結合性。


Java 語言中運算子的優先順序共分為 14 級,其中 1 級最高,14 級最低。在同一個表示式中運算子優先順序高的先執行。表 1 列出了所有的運算子的優先順序以及結合性。


表1 運算子的優先順序

優先順序 運算子 結合性

1 ()、[]、{} 從左向右

2 !、+、-、~、++、-- 從右向左

3 *、/、% 從左向右

4 +、- 從左向右

5 «、»、>>> 從左向右

6 <、<=、>、>=、instanceof 從左向右

7 ==、!= 從左向右

8 & 從左向右

9 ^ 從左向右

10 | 從左向右

11 && 從左向右

12 || 從左向右

13 ?: 從右向左

14 =、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>= 從右向左

使用優先順序為 1 的小括號可以改變其他運算子的優先順序,即如果需要將具有較低優先順序的運算子先運算,則可以使用小括號將該運算子和運算子括起來。例如下面的表示式:

(x-y)*z/5

在這個表示式中先進行括號內的減法運算,再將結果與 z 相乘,最後將積除以 5 得出結果。整個表示式的順序按照從左向右執行,比較容易理解。


再來看一個複雜的表示式,如下所示。

--y || ++x && ++z;

這個表示式中包含了算術運算子和邏輯運算子。根據表 1 中列出的優先順序,可以確定它的執行順序如下:

① 先計算 y 的自減運算子,即 --y。

② 再計算 x 的自增運算子,即 ++x。

③ 接著計算 z 的自增運算子,即 ++z。

④ 由於邏輯與比邏輯或的優先順序高,這裡將 ② 和 ③ 的結果進行邏輯與運算,即 ++x && ++z。

⑤ 最後將 ④ 的結果與 ① 進行邏輯或運算,即 --y||++x&&++z。


如果沒有上述對該表示式執行順序的說明,第一眼看到它時將很難識別優先順序。對於這類問題,可以透過新增小括號使表達的順序更加清晰,而不用去查優先順序表。如下所示為改進後的表示式。

(--y)||((++x)&&(++z));

技巧:記住這麼多運算子的優先順序是比較困難的,因此讀者應該在實際應用中多多練習。


因為 Java 運算子存在這種優先順序的關係,因此在做 SCJP 的時候或者某些公司的面試題,有如下 Java 程式碼:

int a = 5;

int b = 4;

int c = a++- --b*++a/b-- >>2%a--;


問 c 的值是多少?這樣的語句實在太恐怖了,即使多年的老程式設計師看到這樣的語句也會眩暈。這樣的程式碼只能在考試中出現,作為一個程式設計師如果寫這樣的程式碼,恐怕他馬上就得走人了,因為他完全不懂程式開發。


原始碼就是一份文件,原始碼的可讀性比程式碼執行效率更重要。 因此在這裡要提醒大家:

不要把一個表示式寫得過於複雜,如果一個表示式過於複雜,則把它分成幾步來完成。

不要過多地依賴運算子的優先順序來控制表示式的執行順序,這樣可讀性太差,儘量使用()來控制表示式的執行順序。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70007056/viewspace-2846349/,如需轉載,請註明出處,否則將追究法律責任。

相關文章