題目
寫出下列表達式的值,設: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ōu)先級拧簸,但仔細一看發(fā)現(xiàn)還有點別的東西在里邊。
測試代碼
package test;
/**
*
*
寫出下列表達式的值男窟,設: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-- 計算結(jié)果"+(x + y * x--));
}
public static void test2(int x,int y) {
System.out.println("-x * y + y 計算結(jié)果"+(-x * y + y));
}
public static void test3(int x,int y , boolean yn) {
System.out.println("x < y && yn 計算結(jié)果"+(x < y && yn));
}
public static void test4(int x,int y , boolean yn) {
System.out.println("x > y || !yn 計算結(jié)果"+(x > y || !yn));
}
public static void test5(int x,int y) {
System.out.println("y != ++x ? x : y 計算結(jié)果"+(y != ++x ? x : y));
}
public static void test6(int x,int y) {
System.out.println("y++ / --x 計算結(jié)果"+(y++ / --x));
}
}
輸出結(jié)果
x + y * x-- 計算結(jié)果54
-x * y + y 計算結(jié)果-34
x < y && yn 計算結(jié)果true
x > y || !yn 計算結(jié)果false
y != ++x ? x : y 計算結(jié)果4
y++ / --x 計算結(jié)果8
解析
運算符的優(yōu)先級
既然結(jié)果已經(jīng)出來了贾富,我們當然是要看一下為什么會是這樣的結(jié)果歉眷。下圖是百度百科中的一張運算符優(yōu)先級圖。
- 優(yōu)先級1級為最高優(yōu)先級
- 結(jié)合性是指運算符結(jié)合的順序颤枪,通常都是從左到右汗捡。
沒有自身元素操作的運算
對比優(yōu)先級就可以解釋這些沒有對自身元素進行操作的比較結(jié)果了
-x * y + y 計算結(jié)果-34
x < y && yn 計算結(jié)果true
x > y || !yn 計算結(jié)果falsey++ / --x 計算結(jié)果8
帶有自身操作的簡單運算
而對于這樣的一個y++ / --x 計算結(jié)果8表達,我們要知道兩點
- ++ -- 的運算優(yōu)先級大于/
- ++ -- 出現(xiàn)在前面畏纲,自身先自增1在計算扇住,在后邊則反之。
所以實際計算的是int型的17/2(int類型計算的精確度)
帶有自身運算的多次取值問題
最后就是這兩個計算了盗胀,也是比較迷惑性的計算
y != ++x ? x : y 計算結(jié)果4
x + y * x-- 計算結(jié)果54
對于三目運算符艘蹋,我們可以理解成if else語句就好了,為真返回第一個票灰,為假返回第二個值女阀。
當++ -- 操作自身元素時宅荤,計算表達式是什么時候?qū)?nèi)存中的值取出來計算的。
這也是為什么造成y != ++x ? x : y 計算后浸策,取到的值為4冯键,而x + y * x--計算時第一個x為3,不為2的原因庸汗。
我們寫這樣的一個測試
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是因為第一個x取到的值是3,第二個取到的值仍然是3(++在后先取出x值蚯舱,x再自增1).而等于7的是x++取到值后改化,x自增1重新復制給x,所以第二次取到的就是4晓淀,答案就是7了所袁,由此就可以解釋x + y * x-- 計算結(jié)果54的結(jié)果為什么是54了。
最后
當
x = 3;
y = 17;
y != ++x ? x : y 和y != x++ ? x : y 的計算結(jié)果會一樣嗎凶掰?
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