更新時間:2021-05-31 10:55:53 來源:動力節(jié)點 瀏覽852次
所有的數(shù)學(xué)運算都認為是從左向右運算的,Java 語言中大部分運算符也是從左向右結(jié)合的,只有單目運算符、賦值運算符和三目運算符例外,其中,單目運算符、賦值運算符和三目運算符是從右向左結(jié)合的,也就是從右向左運算。
乘法和加法是兩個可結(jié)合的運算,也就是說,這兩個運算符左右兩邊的操作數(shù)可以互換位置而不會影響結(jié)果。運算符有不同的優(yōu)先級,所謂優(yōu)先級就是在表達式運算中的運算順序。
一般而言,單目運算符優(yōu)先級較高,賦值運算符優(yōu)先級較低。算術(shù)運算符優(yōu)先級較高,關(guān)系和邏輯運算符優(yōu)先級較低。多數(shù)運算符具有左結(jié)合性,單目運算符、三目運算符、賦值運算符具有右結(jié)合性。
Java 語言中運算符的優(yōu)先級共分為 14 級,其中 1 級最高,14 級最低。在同一個表達式中運算符優(yōu)先級高的先執(zhí)行。表 1 列出了所有的運算符的優(yōu)先級以及結(jié)合性。
表1 運算符的優(yōu)先級
優(yōu)先級 |
運算符 |
結(jié)合性 |
---|---|---|
1 | ()、[]、{} | 從左向右 |
2 | !、+、-、~、++、-- | 從右向左 |
3 | *、/、% | 從左向右 |
4 | +、- | 從左向右 |
5 | «、»、>>> | 從左向右 |
6 | <、<=、>、>=、instanceof | 從左向右 |
7 | ==、!= | 從左向右 |
8 | & | 從左向右 |
9 | ^ | 從左向右 |
10 | | | 從左向右 |
11 | && | 從左向右 |
12 | || | 從左向右 |
13 | ?: | 從右向左 |
14 | =、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>= | 從右向左 |
使用優(yōu)先級為 1 的小括號可以改變其他運算符的優(yōu)先級,即如果需要將具有較低優(yōu)先級的運算符先運算,則可以使用小括號將該運算符和操作符括起來。例如下面的表達式:
(x-y)*z/5
在這個表達式中先進行括號內(nèi)的減法運算,再將結(jié)果與 z 相乘,最后將積除以 5 得出結(jié)果。整個表達式的順序按照從左向右執(zhí)行,比較容易理解。
再來看一個復(fù)雜的表達式,如下所示。
--y || ++x && ++z;
這個表達式中包含了算術(shù)運算符和邏輯運算符。根據(jù)表 1 中列出的優(yōu)先級,可以確定它的執(zhí)行順序如下:
1.先計算 y 的自減運算符,即 --y。
2.再計算 x 的自增運算符,即 ++x。
3.接著計算 z 的自增運算符,即 ++z。
4.由于邏輯與比邏輯或的優(yōu)先級高,這里將2和3的結(jié)果進行邏輯與運算,即 ++x && ++z。
5.最后將4的結(jié)果與1進行邏輯或運算,即 --y||++x&&++z。
如果沒有上述對該表達式執(zhí)行順序的說明,第一眼看到它時將很難識別優(yōu)先級。對于這類問題,可以通過添加小括號使表達的順序更加清晰,而不用去查優(yōu)先級表。如下所示為改進后的表達式。
(--y)||((++x)&&(++z));
技巧:記住這么多運算符的優(yōu)先級是比較困難的,因此讀者應(yīng)該在實際應(yīng)用中多多練習(xí)。
因為 Java 運算符存在這種優(yōu)先級的關(guān)系,因此在做 SCJP 的時候或者某些公司的面試題,有如下 Java 代碼:
int a = 5;
int b = 4;
int c = a++- --b*++a/b-- >>2%a--;
問 c 的值是多少?這樣的語句實在太恐怖了,即使多年的老程序員看到這樣的語句也會眩暈。這樣的代碼只能在考試中出現(xiàn),作為一個程序員如果寫這樣的代碼,恐怕他馬上就得走人了,因為他完全不懂程序開發(fā)。
源代碼就是一份文檔,源代碼的可讀性比代碼運行效率更重要。 因此在這里要提醒大家:
不要把一個表達式寫得過于復(fù)雜,如果一個表達式過于復(fù)雜,則把它分成幾步來完成。
不要過多地依賴運算符的優(yōu)先級來控制表達式的執(zhí)行順序,這樣可讀性太差,盡量使用()來控制表達式的執(zhí)行順序。
以上就是動力節(jié)點小編介紹的"Java語言運算符優(yōu)先級",希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為您服務(wù)。