java運算子優先順序
所有的數學運算都認為是從左向右運算的,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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- php運算子優先順序PHP
- Python 運算子優先順序 運算子Python
- python運算子及優先順序順序Python
- C++運算子優先順序C++
- java字串連線和運算子優先順序Java字串
- C 語言運算子優先順序
- C語言運算子優先順序C語言
- JS與&& 或||運算子 優先順序JS
- C++運算子優先順序特例C++
- C++ 運算子優先順序表C++
- Java常見知識點彙總(⑤)——運算子優先順序Java
- [java基礎] 之 表示式和運算子的優先順序Java
- 介紹python中運算子優先順序Python
- JavaScript陰溝裡翻船之運算子優先順序JavaScript
- Like Sunday, Like Rain - JavaScript運算子優先順序AIJavaScript
- 各類運算子和計算方法,優先順序
- ORACLE中sql語句----運算子的優先順序OracleSQL
- oracle plsql儲存過程_運算子優先順序OracleSQL儲存過程
- VBA運算子的型別及優先順序(轉)型別
- C語言常被搞錯的運算子優先順序C語言
- lodash原始碼分析之baseFindIndex中的運算子優先順序原始碼Index
- C++ 運算子優先順序列表C++
- [JAVA] 不僅有Java運算子,更有優先順序講解,可以說很詳細了Java
- 程式設計答疑:記不住運算子優先順序怎麼辦?程式設計
- 面試題:物件的儲存形式 和 . 運算子的優先順序面試題物件
- Solidity語言學習筆記————8、運算子優先順序Solid筆記
- javascript基礎(賦值運算子,關係運算子,相等運算子,三元運算子,運算子的優先順序,程式碼塊)(十)JavaScript賦值
- 運算子的關係,什麼叫一元運算子,二元運算子,三元運算子,運算子優先順序,以及運算子的
- 如果你不懂js運算子優先順序,那絕對不是js高手。JS
- java setPriority()設定優先順序Java
- java執行緒優先順序Java執行緒
- CSS優先順序CSS
- js運算子優先順序及賦值運算var a = {n:1};var b = a;a.x = a = {n:2};JS賦值
- 中斷優先順序
- Java優先順序佇列DelayedWorkQueue原理分析Java佇列
- Java之執行緒的優先順序Java執行緒
- C語言運算子優先順序列表(超詳細)C語言
- Android程式優先順序Android