成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

理解在java “”i=i++;”所發(fā)生的事情

BigTomato / 1997人閱讀

淺談java中的 “i=i++;”

首先有一下代碼:

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

你可以試想這段代碼是多少 大多數(shù)同學(xué)可能會(huì)回答是13,然而事實(shí)并非如此,如下圖結(jié)果:


在上圖中,我首先進(jìn)行了運(yùn)行,可以看到結(jié)果,我們的i并不是如大多人猜測(cè)的那樣為13輸出 ,而是看上去沒有做這個(gè)自增的操作,然而這是為什么呢?

于是,就有了后面反編譯為字節(jié)碼的操作,我們利用javap 指令反編譯后可以看清楚其中發(fā)生的事情,有同學(xué)對(duì)其中的JVM指令不清楚,沒關(guān)系,我這里先普及一下本文代碼中所涉及的JVM指令;

(這里的關(guān)鍵指令碼在于main方法之后,因此只針對(duì)于下面的指令進(jìn)行解釋,其之前的是虛擬機(jī)自動(dòng)構(gòu)建的默認(rèn)構(gòu)造方法的指令碼)

1.bipush: 將單字節(jié)的常量值(-128~127)推送至棧頂
2.istore: 將棧頂int型數(shù)值存入指定本地變量
3.iload: 將指定的int型本地變量推送至棧頂
4.iinc: 該指令用于對(duì)本地(局部)變量進(jìn)行自增減操作。該指令第一參數(shù)為本地變量的編號(hào),第二個(gè)參數(shù)為自增減的數(shù)量
5.getstatic 獲取指定類的靜態(tài)域,并將其值壓入棧頂(到這個(gè)位置之后就是調(diào)用靜態(tài)對(duì)象out打印的操作不再贅述,感興趣的同學(xué)可以在本文末尾附上的鏈接的去了解一下)

知道基本的幾個(gè)指令之后我們來分析上圖中關(guān)鍵指令的意思吧:

bipush 12這里是把12推至棧頂 棧里存儲(chǔ)了12 這個(gè)int數(shù)值

istore_1 這里是把12彈出給第二個(gè)(備注:第1個(gè)本地變量應(yīng)該是this)本地變量 即i=12

iload_1 這里是把第二個(gè)本地變量(i)的值推入棧頂 此時(shí)棧頂為12

iinc 1,1 自然是i=i+1 即i++ 這個(gè)時(shí)候i=13

istore_1這里是把棧頂值彈出給本地變量i,這個(gè)時(shí)候 i又被賦值為 12

因此最終 打印出來的時(shí)候i為12。

CSDN一老哥整理的JVM指令集合,很方便查詢學(xué)習(xí)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76594.html

相關(guān)文章

  • 16.java異常處理

    摘要:不受檢查異常為編譯器不要求強(qiáng)制處理的異常,檢查異常則是編譯器要求必須處置的異常。潛在的異常處理器是異常發(fā)生時(shí)依次存留在調(diào)用棧中的方法的集合。當(dāng)運(yùn)行時(shí)系統(tǒng)遍歷調(diào)用棧而未找到合適的異常處理器,則運(yùn)行時(shí)系統(tǒng)終止。異常處理涉及到五個(gè)關(guān)鍵字,分別是。 概念 程序運(yùn)行時(shí),發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常。 異常是程序中的一些錯(cuò)誤,但并不是所有的錯(cuò)誤都是異常,并...

    asce1885 評(píng)論0 收藏0
  • 凱文•斯拉文:算法塑造世界

    摘要:在中,算法專家凱文斯拉文提起這個(gè)故事,并向觀眾展示了算法控制的圖景。斯拉文把算法稱之為計(jì)算機(jī)用于決策的數(shù)學(xué)。凱文斯拉文表示我們正在用炸藥和巖石鋸打穿美國(guó),讓算法能早微秒完成交易,所有的一切都是為了一個(gè)前所未有的通訊系統(tǒng)。 The Making of a Fly,這是一本1992年出版的學(xué)術(shù)書籍,受研究者喜歡。2011年4月8日,一家書商對(duì)其的售價(jià)為170萬美元,另一家書商標(biāo)價(jià)220萬美元。如...

    iamyoung001 評(píng)論0 收藏0
  • 如何理解I/O多路復(fù)用

    摘要:為了講清復(fù)用的是什么,首先得先說明一下邏輯流的概念。理解了這個(gè),那么所謂的復(fù)用,指的就是在一個(gè)邏輯流里處理多個(gè)事件如何做到利用多路復(fù)用器,輪詢監(jiān)聽各路,如果一旦有事件發(fā)生,那么就去處理,否則程序阻塞。 java nio提供了一套稱為I/O多路復(fù)用的編程范式,那么什么叫做I/O多路復(fù)用呢?所謂的I/O多路復(fù)用,從字面意思上來理解,就是:有多個(gè)I/O操作(或是寫,或是讀,或是請(qǐng)求),這多個(gè)...

    desdik 評(píng)論0 收藏0
  • Java視角理解系統(tǒng)結(jié)構(gòu)(二)CPU緩存

    摘要:從視角理解系統(tǒng)結(jié)構(gòu)連載關(guān)注我的微博鏈接了解最新動(dòng)態(tài)眾所周知是計(jì)算機(jī)的大腦它負(fù)責(zé)執(zhí)行程序的指令內(nèi)存負(fù)責(zé)存數(shù)據(jù)包括程序自身數(shù)據(jù)同樣大家都知道內(nèi)存比慢很多其實(shí)在年前的頻率和內(nèi)存總線的頻率在同一個(gè)級(jí)別訪問內(nèi)存只比訪問寄存器慢一點(diǎn)兒由于內(nèi)存的發(fā)展受到 從Java視角理解系統(tǒng)結(jié)構(gòu)連載, 關(guān)注我的微博(鏈接)了解最新動(dòng)態(tài) 眾所周知, CPU是計(jì)算機(jī)的大腦, 它負(fù)責(zé)執(zhí)行程序的指令; 內(nèi)存負(fù)責(zé)存數(shù)據(jù),...

    eternalshallow 評(píng)論0 收藏0
  • JVM 類初始化機(jī)制

    摘要:當(dāng)你在程序中對(duì)象時(shí),有沒有考慮過是如何把靜態(tài)的字節(jié)碼轉(zhuǎn)化為運(yùn)行時(shí)對(duì)象的呢,這個(gè)問題看似簡(jiǎn)單,但清楚的同學(xué)相信也不會(huì)太多,這篇文章首先介紹類初始化的機(jī)制,然后給出幾個(gè)易出錯(cuò)的實(shí)例來分析,幫助大家更好理解這個(gè)知識(shí)點(diǎn)。 當(dāng)你在 Java 程序中new對(duì)象時(shí),有沒有考慮過 JVM 是如何把靜態(tài)的字節(jié)碼(byte code)轉(zhuǎn)化為運(yùn)行時(shí)對(duì)象的呢,這個(gè)問題看似簡(jiǎn)單,但清楚的同學(xué)相信也不會(huì)太多,這篇...

    20171112 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<