java中運(yùn)算符的優(yōu)先級(jí)

題目

寫出下列表達(dá)式的值,設(shè):x=3,y=17,yn=true。
(1)x + y * x-- = 54
(2)-x * y + y = -34
(3)x < y && yn = true
(4)x > y || !yn = false
(5)y != ++x ? x : y = 4
(6)y++ / --x = 8

最近看到這樣的一道題目,初看之下考的運(yùn)算符的優(yōu)先級(jí),但仔細(xì)一看發(fā)現(xiàn)還有點(diǎn)別的東西在里邊。

測試代碼

package test;


/**
 *
 * 
 寫出下列表達(dá)式的值,設(shè):x=3,y=17,yn=true。
(1)x + y * x-- = 54
(2)-x * y + y = -34
(3)x < y && yn = true
(4)x > y || !yn = false
(5)y != ++x ? x : y = 4
(6)y++ / --x = 8
 *
 */
public class Test {
    public static void main(String[] args) {
        test1(3,17);
        test2(3,17);
        test3(3,17,true);
        test4(3,17,true);
        test5(3,17);
        test6(3,17);
    }
    
    public static void test1(int x,int y) {
        System.out.println("x + y * x-- 計(jì)算結(jié)果"+(x + y * x--));
    }
    public static void test2(int x,int y) {
        System.out.println("-x * y + y 計(jì)算結(jié)果"+(-x * y + y));
    }
    public static void test3(int x,int y , boolean yn) {
        System.out.println("x < y && yn 計(jì)算結(jié)果"+(x < y && yn));
    }
    public static void test4(int x,int y , boolean yn) {
        System.out.println("x > y || !yn 計(jì)算結(jié)果"+(x > y || !yn));
    }
    public static void test5(int x,int y) {
        System.out.println("y != ++x ? x : y 計(jì)算結(jié)果"+(y != ++x ? x : y));
    }
    public static void test6(int x,int y) {
        System.out.println("y++ / --x 計(jì)算結(jié)果"+(y++ / --x));
    }
}

輸出結(jié)果

x + y * x-- 計(jì)算結(jié)果54
-x * y + y 計(jì)算結(jié)果-34
x < y && yn 計(jì)算結(jié)果true
x > y || !yn 計(jì)算結(jié)果false
y != ++x ? x : y 計(jì)算結(jié)果4
y++ / --x 計(jì)算結(jié)果8

解析

運(yùn)算符的優(yōu)先級(jí)

既然結(jié)果已經(jīng)出來了,我們當(dāng)然是要看一下為什么會(huì)是這樣的結(jié)果。下圖是百度百科中的一張運(yùn)算符優(yōu)先級(jí)圖。

image
  • 優(yōu)先級(jí)1級(jí)為最高優(yōu)先級(jí)
  • 結(jié)合性是指運(yùn)算符結(jié)合的順序,通常都是從左到右。
沒有自身元素操作的運(yùn)算

對(duì)比優(yōu)先級(jí)就可以解釋這些沒有對(duì)自身元素進(jìn)行操作的比較結(jié)果了

-x * y + y 計(jì)算結(jié)果-34
x < y && yn 計(jì)算結(jié)果true
x > y || !yn 計(jì)算結(jié)果falsey++ / --x 計(jì)算結(jié)果8
帶有自身操作的簡單運(yùn)算

而對(duì)于這樣的一個(gè)y++ / --x 計(jì)算結(jié)果8表達(dá),我們要知道兩點(diǎn)

  • ++ -- 的運(yùn)算優(yōu)先級(jí)大于/
  • ++ -- 出現(xiàn)在前面,自身先自增1在計(jì)算,在后邊則反之。

所以實(shí)際計(jì)算的是int型的17/2(int類型計(jì)算的精確度)

帶有自身運(yùn)算的多次取值問題

最后就是這兩個(gè)計(jì)算了,也是比較迷惑性的計(jì)算

y != ++x ? x : y 計(jì)算結(jié)果4

x + y * x-- 計(jì)算結(jié)果54

對(duì)于三目運(yùn)算符,我們可以理解成if else語句就好了,為真返回第一個(gè),為假返回第二個(gè)值。

當(dāng)++ -- 操作自身元素時(shí),計(jì)算表達(dá)式是什么時(shí)候?qū)?nèi)存中的值取出來計(jì)算的。

這也是為什么造成y != ++x ? x : y 計(jì)算后,取到的值為4,而x + y * x--計(jì)算時(shí)第一個(gè)x為3,不為2的原因。

我們寫這樣的一個(gè)測試

    public static void main(String[] args) {
        int x = 3;
        System.out.println("x + x++ = "+ (x + x++));
        x = 3;
        System.out.println("x++ + x = " + (x++ + x));
    }

結(jié)果

x + x++ = 6
x++ + x = 7

從結(jié)果來看,等于6是因?yàn)榈谝粋€(gè)x取到的值是3,第二個(gè)取到的值仍然是3(++在后先取出x值,x再自增1).而等于7的是x++取到值后,x自增1重新復(fù)制給x,所以第二次取到的就是4,答案就是7了,由此就可以解釋x + y * x-- 計(jì)算結(jié)果54的結(jié)果為什么是54了。

最后

當(dāng)

x = 3;
y = 17;

y != ++x ? x : yy != x++ ? x : y 的計(jì)算結(jié)果會(huì)一樣嗎?

    public static void main(String[] args) {
        int x = 3;
        int y = 17;
        System.out.println("y != ++x ? x : y = "+ (y != ++x ? x : y));
        x = 3;
        y = 17;
        System.out.println("y != x++ ? x : y =" + (y != x++ ? x : y));
    }

先自己算一下結(jié)。

答案是:

y != ++x ? x : y = 4
y != x++ ? x : y =4
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容