每次遇到i++與++i的問題,我就想吐槽下心中不爽的情緒,是那個混蛋總愛考這種沒有任何意義的玩意,大學(xué)期間考試總是這種題目,即使是筆試很多時候也少不了這種題目。
對于多種優(yōu)先級與i++,++i 結(jié)合的考題,有木有想干死它的心。
<c primer plus>中作者也是極力反對此種寫法的,一個括號就解決的問題,但是誰有辦法呢?
先看下面一段代碼
public static void main(String[] args) {
int i = 0;
i = i++ + ++i;
System.out.println(i);
}
我們首先反匯編這段代碼
javac Demo.java
javap -c Demo
得到匯編代碼如下:
Compiled from "Demo.java"
public class Demo {
public Demo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: iinc 1, 1
9: iload_1
10: iadd
11: istore_1
12: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
15: iload_1
16: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
19: return
}
上面的代碼執(zhí)行過程如下:
- 計算i++
- 計算++i
- 將前兩個計算的結(jié)果加起來賦值給i
步驟1
int copy1 = i;
i++
步驟2
i++
int copy2 = i
步驟3
i = copy1 + copy2;
i= copy1 + copy2 (也就是0+2)
總之記住 i++是先賦值->給臨時變量temp,然后自身加1;++i先自身加1 后賦值給臨時變量temp;
面試題一
int a = 5,b = 3;
if(!(a==b)&&a==1+b++){
}
System.out.println(a);
System.out.println(b);
因為!(a==b) 整體為true,繼續(xù)執(zhí)行 a==1+b++;
注意是==,而不是=
int copy = b;
b++;
故 b = b+1 = 4;
面試題二
陷阱題:
public class Demo {
public static void main(String[] args) {
int j = 0;
for(int i=0;i<100;i++){
j = j++;
}
System.out.println(j);
}
}
結(jié)果是 0
分析:
仍然根據(jù)jvm原理,java匯編碼中用了中間緩存變量的機制
j = j++ 等價于
int copy = j; j = j+1;
j = copy; 故 = 0
public class Demo {
public static void main(String[] args) {
int j = 0;
for(int i=0;i<100;i++){
j = ++j;
}
System.out.println(j);
}
}
結(jié)果 為 100
分析:
j = j+1; int copy = j;
j = copy;
public class Demo {
public static void main(String[] args) {
int j = 0;
for(int i=0;i<100;i++){
j++; //或者 ++j ;等同
}
System.out.println(j);
}
}
結(jié)果 100
面試題三
int i = 0,j=0, k = 0;
i = ++i + i++ + i++ + i++;
j = j++ + j++ + j++ + ++j;
k = ++k + ++k;
int p1=0,p2 =0; int q1=0,q2 = 0;
q1=++p1;
q2=p2++;
結(jié)果分別是:
i=7
j=7
k=3
p1=1
p2=1
q1=1
q2=0
再舉一例 j的值 來分析
j = (j++) + (j++)+(j++)+(++j)
表達式從左向右計算,把每個括號看作為一個整體.局部變量用jt等表示.
int j = 0;
(1). jt1 = j; j = j+1; // jt1 = 0;j=1;
(2). jt2 = j ; j = j+1; // jt2 = 1;j=2;
(3). jt3 = j; j = j+1; // jt3 = 2; j =3;
(4). j = j+1; jt4 = j; // j = 4; jt4 = 4;
故 最終結(jié)果為:
j = jt1 + jt2 + jt3 + jt4 = 0+1+2+4 = 7;