1. 程式人生 > >Java開發筆記(十四)幾種運算子的優先順序順序

Java開發筆記(十四)幾種運算子的優先順序順序

到目前為止,我們已經學習了Java語言的好幾種運算子,包括算術運算子、賦值運算子、邏輯運算子、關係運算符等基礎運算子,並且在書寫賦值語句時都沒新增圓括號,顯然是默認了先完成算術、邏輯、關係等運算,最後才進行賦值操作。也就是說,在這四類運算子當中,賦值運算子的優先順序最低,那麼其他三種運算子的優先順序順序又是如何排列的呢?
首先來看算術運算子,Java中的算術運算子主要包括正號負號、加減乘除,以及取餘數符號。對於數學上的四則運算來說,大家早已熟知乘法和除法的優先順序高於加法和減法,它們在Java程式設計中的優先順序順序也是如此,因為取餘數運算依賴於除法操作,所以取餘數運算跟乘除運算的優先順序是一樣的。另外還有正號和負號運算,其實主要是負號運算的優先順序,數學上約定俗成負數可以直接參與四則運算,這意味著負號作為數字前面的減號,它的優先順序比四則運算要高。於是算術運算子內部各符號的優先順序順序依次為:+正號、-負號 > 乘號*、除號/、取餘數符號% > 加號+、減號-,下面是演示算術運算子優先順序的程式碼例子:

// 比較加減乘除以及取餘數運算的優先順序順序
int fiveArithmetic = 7+5-4*6/3%9; // 等價於“7+5-(4*6/3%9)”
System.out.println("fiveArithmetic="+fiveArithmetic);
// 比較負號與乘除運算的優先順序順序
int negativeArithmetic = -8/4+2*-3; // 等價於“(-8)/4+2*(-3)”
System.out.println("negativeArithmetic="+negativeArithmetic);

再來看關係運算符,關係符號包括等號、不等號、大於號、小於號等等,它們互相之間的優先順序是一樣的。把關係運算符跟算術運算子作比較,按慣例應當是大於小於號不如加減乘除優先,Java程式碼裡的關係運算優先順序也確實低於算術運算。也就是說,某個式子要等到加減乘除計算完畢,接下來才會進行大於、等於和小於的關係比較。下面是比較算術運算子和關係運算符優先順序的程式碼示例:

// 以下比較算術運算子和關係運算符的優先順序順序
boolean greaterResult = 1+2>3+4; // 等價於“(1+2)>(3+4)”
System.out.println("greaterResult="+greaterResult);
boolean lessResult = 1+2<3+4; // 等價於“(1+2)<(3+4)”
System.out.println("lessResult="+lessResult);

接著看邏輯運算子,由於邏輯運算的與或非操作只對布林變數進行,因此它跟運算元值變數的算術運算沒有可比性,布林型別與數值型別可是井水不犯河水,完全是風馬牛不相及。故而邏輯運算只能與關係運算一較高下,因為關係運算的計算結果是布林型別,同時邏輯運算的操作元素也為布林型別,所以光憑感覺就可認為關係運算先於邏輯運算進行。這個推理的確適用於“與”、“或”、“異或”這三種邏輯運算,但並不適用於“非”運算,緣由在於“非”運算只有一個運算元。凡是隻有一個運算元的運算子都歸類為一元操作符,而一元操作符的優先順序要高於二元操作符,是故負號運算比乘除運算優先,同理“非”運算也比大於等於小於要優先。但凡某變數前面出現了感嘆號“!”,那麼一定會先對該變數進行非運算,除非有個圓括號把感嘆號後面的式子給圈起來。
於是邏輯運算最終的優先順序順序為:邏輯非運算! > 關係運算符(含等號、不等號) > 其它邏輯運算子(含與符號&、或符號|、異或符號^)。下面是比較邏輯運算和關係運算的優先順序程式碼:

// 比較邏輯與運算以及關係運算符的優先順序順序
boolean andResult = 1>2&3<4; // 等價於“(1>2)&(3<4)”
System.out.println("andResult="+andResult);
// 比較邏輯或運算以及關係運算符的優先順序順序
boolean orResult = 1>2|3<4; // 等價於“(1>2)|(3<4)”
System.out.println("orResult="+orResult);
// 比較邏輯異或運算以及關係運算符的優先順序順序
boolean xorResult = 1>2^3<4; // 等價於“(1>2)^(3<4)”
System.out.println("xorResult="+xorResult);
// 比較邏輯非運算以及關係運算符的優先順序順序
boolean zhen = true;
boolean jia = false;
boolean notResult = zhen==!jia; // 等價於“zhen==(!jia)”
System.out.println("notResult="+notResult);

總結一下,倘若沒有圓括號加以約束,那麼對於數值變數來說,幾種運算子的優先順序順序依次為:正號、負號 > 乘號、除號、取餘號 > 加號、減號 > 大於號、等號、小於號、不等號 > 各種賦值符號;對於布林變數來說,相關運算子的優先順序順序依次為:邏輯非 > 等號、不等號 > 邏輯與、或、異或 > 各種賦值符號。