i=i++的探討

public class Test{ public static void main(String[] args){ int i=0; int a=i++; System.out.println(i); System.out.println(a); } } 對於上述代碼,發現一個朋友在討論這個問題,今天仔細研究了一下,發現其中的問題仍是不少的。 1.執行javap -c Test     E:\第二階段練習文件\js\test>javap -c Test Compiled from "Test.java" public class Test extends java.lang.Object{ public Test();   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:   istore_2    7:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;    10:  iload_1    11:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V    14:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;    17:  iload_2    18:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V    21:  return } 這是執行的結果,仔細研究這個反編譯過程,並查找了一些資料,以爲應該是解決了這個問題。 2.談談體會:     開始的時候在棧中放入0,爲i的引用。     而後計算i++,很明顯,a的值爲1,而後i爲2.     固然這個誰都知道,那i=i++呢?若是是這個問題,就比較複雜了,可是想通了以後,你就知道我爲何要寫上述的程序了。 來看看i=i++的程序:      public class Test{ public static void main(String[] args){ int i=0; i=i++; System.out.println(i); } } 執行反編譯的結果:     E:\第二階段練習文件\js\test>javap -c Test Compiled from "Test.java" public class Test extends java.lang.Object{ public Test();   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:   istore_1    7:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;    10:  iload_1    11:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V    14:  return } 結果是:     0 爲何呢?     首先,在棧中放入0     而後,將i=i++中的i++計算,可知,要將i=0這個值賦給 i=i++ 中的前面的那個i,這就是java會給i分配一個新的虛擬空間來保存這個數據,而當後面的那個i計算爲1以後,這個表達式就執行完畢,可是,此時,高潮來了。     前面的那個i中的值將會從棧中被取出並覆蓋了後面的那個i,由於這裏只許擁有一個i變量,後面的那個i原本是1,可是它的值在棧中被先取出來了,因此是開始爲1,最後爲0(這個0是由前面那個i放進去的)
相關文章
相關標籤/搜索