徹底搞定i++與++i

每次遇到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í)行過程如下:

  1. 計算i++
  2. 計算++i
  3. 將前兩個計算的結(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;

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

相關(guān)閱讀更多精彩內(nèi)容

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