首頁  >  文章  >  Java  >  深層理解在java中的 '”i=i++;”的運算結果及運作原理

深層理解在java中的 '”i=i++;”的運算結果及運作原理

php是最好的语言
php是最好的语言原創
2018-08-02 14:41:151750瀏覽

淺談java中的「i=i ;」

首先有一下程式碼:

    public class Demo{
        public static void main(String []args){
            int i=12;
            i=i++;
            System.out.println(i);
        }
    }

你可以試想這段程式碼是多少 大多數同學可能會回答是13,然而事實並非如此,如下圖結果:

深層理解在java中的 ”i=i++;”的運算結果及運作原理

在上圖中,我首先進行了運行,可以看到結果,我們的i並不是如大多人猜測的那樣為13輸出,而是看起來沒有做這個自增的操作,然而這是為什麼呢?

於是,就有了後面反編譯為字節碼的操作,我們利用javap 指令反編譯後可以看清楚其中發生的事情,有同學對其中的JVM指令不清楚,沒關係,我這裡先普及一下本文程式碼中所涉及的JVM指令;

(這裡的關鍵指令碼在於main方法之後,因此只針對於下面的指令進行解釋,其之前的是虛擬機自動構建的預設建構方法的指令碼)

1.bipush:  將單字節的常數值(-128~127)推送到堆疊頂部
2.istore:  將堆疊頂部int型數值存入指定本地變數 
3.iload:   將指定的int型本地變數推送至堆疊頂部
4.iinc: 此指令用於對本地(局部)變數進行自增減操作。此指令第一參數為本地變數的編號,第二個參數為自增減的數量 
# 5.getstatic  取得指定類別的靜態域,並將其值壓入堆疊頂端(到這個位置之後就是呼叫靜態物件out列印的操作不再贅述,有興趣的同學可以在本文末尾附上的連結的去了解一下)

知道基本的幾個指令之後我們來分析上圖中關鍵指令的意思吧:

  1. bipush 12這裡是把12推到棧頂堆疊裡儲存了12 這個int數值

  2. ##istore_1 這裡是把12彈出給第二個(備註:第1個本地變數應該是this)本地變數即i=12

  3. #iload_1 這裡是把第二個本地變數(i)的值推入棧頂此時棧頂為12

  4. iinc 1,1 自然是i=i 1 即i  這個時候i=13

  5. istore_1這裡是把棧頂值彈出給本地變數i,這個時候i又被賦值為12

因此最後印出來的時候i為12。

CSDN一老哥整理的JVM指令集合,很方便查詢學習

相關文章:

i 的相關問題

i 與 i  的差異

相關影片:


JAVA教學手冊

以上是深層理解在java中的 '”i=i++;”的運算結果及運作原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn