到目前為止,我們已經學習了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);
總結一下,倘若沒有圓括號加以約束,那么對於數值變量來說,幾種運算符的優先級順序依次為:正號、負號 > 乘號、除號、取余號 > 加號、減號 > 大於號、等號、小於號、不等號 > 各種賦值符號;對於布爾變量來說,相關運算符的優先級順序依次為:邏輯非 > 等號、不等號 > 邏輯與、或、異或 > 各種賦值符號。