題目
寫出下列表達(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í)圖。
- 優(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 : y 和y != 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