官术网_书友最值得收藏!

3.1.3 運算符的優(yōu)先級順序

到目前為止,我們已經(jīng)學(xué)習(xí)了Java語言的好幾種運算符,包括算術(shù)運算符、賦值運算符、邏輯運算符、關(guān)系運算符等基礎(chǔ)運算符,并且在書寫賦值語句時都沒添加圓括號,顯然是默認(rèn)了先完成算術(shù)運算、邏輯運算、關(guān)系運算,最后才開展賦值操作。也就是說,在這4類運算符中,賦值運算符的優(yōu)先級最低。那么其他3種運算符的優(yōu)先級順序又是如何排列的呢?

首先來看算術(shù)運算符。Java中的算術(shù)運算符主要包括正號、負(fù)號、加號、減號、乘號、除號以及取余數(shù)符號。對于數(shù)學(xué)上的四則運算來說,大家早已熟知乘法和除法的優(yōu)先級高于加法和減法,它們在Java編程中的優(yōu)先級順序也是如此,因為取余數(shù)運算依賴于除法操作,所以取余數(shù)運算跟乘除運算的優(yōu)先級是一樣的。另外,還有正號和負(fù)號運算,其實主要是負(fù)號運算的優(yōu)先級,數(shù)學(xué)上約定俗成負(fù)數(shù)可以直接參與四則運算,這意味著負(fù)號作為數(shù)字前面的減號,它的優(yōu)先級比四則運算 要高。

于是算術(shù)運算符內(nèi)部各符號的優(yōu)先級順序依次為:正號(+)、負(fù)號(-)>乘號(*)、除號(/)、取余數(shù)符號(%)>加號(+)、減號(-)。下面是演示算術(shù)運算符優(yōu)先級的代碼例子(完整代碼見本章源碼的src\com\control\logic\Priority.java):

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

再來看關(guān)系運算符。關(guān)系符號包括等號、不等號、大于號、小于號等,它們互相之間的優(yōu)先級是一樣的。把關(guān)系運算符跟算術(shù)運算符作比較,按慣例應(yīng)當(dāng)是大于號、小于號和等于號不如加號、減號、乘號、除號優(yōu)先,Java代碼中的關(guān)系運算優(yōu)先級也確實低于算術(shù)運算。也就是說,某個式子要等到加減乘除計算完畢,接下來才會開展大于、等于和小于的關(guān)系比較。下面是比較算術(shù)運算符和關(guān)系運算符優(yōu)先級的代碼示例:

        // 以下比較算術(shù)運算符和關(guān)系運算符的優(yōu)先級順序
        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);

接著看邏輯運算符。由于邏輯運算的與或非操作只對布爾變量生效,因此跟操作數(shù)值變量的算術(shù)運算沒有可比性,布爾類型與數(shù)值類型二者井水不犯河水,完全是風(fēng)馬牛不相及。故邏輯運算只能與關(guān)系運算一較高下。因為關(guān)系運算的計算結(jié)果是布爾類型的,同時邏輯運算的操作元素也為布爾類型的,所以僅憑感覺就可認(rèn)為關(guān)系運算優(yōu)先于邏輯運算。這個推理的確適用于“與”“或”“異或”這3種邏輯運算,但并不適用于“非”運算,緣由在于“非”運算只有一個操作數(shù)。凡是只有一個操作數(shù)的運算符都?xì)w類為一元操作符,而一元操作符的優(yōu)先級要高于二元操作符,因此負(fù)號運算比乘除運算優(yōu)先,同理“非”運算也比大于、等于、小于優(yōu)先。但凡布爾變量前面出現(xiàn)了感嘆號“!”,那么一定會先對該變量做“非”運算,除非有一個圓括號把感嘆號后面的式子括起來。

于是邏輯運算最終的優(yōu)先級順序為:邏輯非運算符(!)>關(guān)系運算符(含等號、不等號)>其他邏輯運算符(含與符號(&)、或符號(|)、異或符號(^))。下面是比較邏輯運算符和關(guān)系運算符的優(yōu)先級的代碼:

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

總結(jié)一下,倘若沒有圓括號加以約束,那么對于數(shù)值變量來說,幾種運算符的優(yōu)先級順序依次為:正號、負(fù)號>乘號、除號、取余號>加號、減號>大于號、等號、小于號、不等號>各種賦值符號;對于布爾變量來說,相關(guān)運算符的優(yōu)先級順序依次為:邏輯非>等號、不等號>邏輯與、邏輯或、邏輯異或>各種賦值符號。把這些運算符放到一起,則它們的優(yōu)先級順序排列見表3-2。

表3-2 幾種運算符的優(yōu)先級排序

主站蜘蛛池模板: 阳春市| 许昌市| 焦作市| 黑水县| 西城区| 天全县| 潜山县| 酒泉市| 鹤山市| 襄汾县| 韶山市| 乌兰县| 栾川县| 南汇区| 巴楚县| 广汉市| 盐亭县| 自治县| 沅陵县| 五大连池市| 阿拉善右旗| 错那县| 朔州市| 凌源市| 饶平县| 平利县| 长白| 湄潭县| 淅川县| 滨海县| 临朐县| 五莲县| 广灵县| 金寨县| 垣曲县| 潜山县| 绵竹市| 工布江达县| 宣恩县| 遵化市| 宜章县|