Java中i=i++;運算結果

Java中i=i++;運算結果

分類: java 54人閱讀 評論(0) 收藏 舉報

今天看到一個題,結果和原本想的不太一樣,也有些意思,同時也深入地考慮到更多情況。
原本的題大體如下,
以下程序的輸出結果是什麼?
Class Test{
  public static void main(String [] args){
      int i = 0;
      i = i++;
      System.out.println(“i=”+i);
   }
}
答案是 i=0;
剛開始是思考的時候認爲答案是i=1,到來是看答案是1,不信,又自己寫了代碼,果然是0,卻不清楚原因,後來和同學討論了下,猜想是編譯器的原因。
這段代碼的在編譯的過程中爲賦值語句的左邊可以看作設置了一個臨時變量,i=i++運算過程可分解如下:(臨時變量設置爲temp)
temp = i++;(temp = 0,這一部可以分解爲temp = i;i++;)
i = temp;(i=0)
後來在網上查了一下,根據java中JVM對這道題有以下解析(引用http://www.cnblogs.com/wangjisi/archive/2010/06/06/1752600.html)
jvm裏面有兩個存儲區,一個是暫存區(是一個堆棧,以下稱爲堆棧),另一個是變量區。
語句istore_1是將堆棧中的值彈出存入相應的變量區(賦值);語句iload_1是將變量區中的值暫存如堆棧中。
因爲i = i++;是先將i的值(1)存入堆棧,然後對變量區中的i自加1,這時i的值的確是2,但是隨後的istore_1又將堆棧的值(1)彈出賦給變量區的i,所以最後i =1。
又因爲i = ++i;是先對變量區中的i自加1,然後再將變量區中i的值(2)存入堆棧,雖然最後執行了istore_1,但也只是將堆棧中的值(2)彈出賦給變量區的i,所以i = ++i;的結果是i = 2。

在C#中也有同樣的問題,值是也是0。但是c/c++的運算結果卻是 1.
原因是c/c++中沒有另外設置一個臨時變量或是臨時空間來保存i,所有操作都是在一個內存空間中完成的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章