淺談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
摘要:不受檢查異常為編譯器不要求強(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ò)誤都是異常,并...
摘要:在中,算法專家凱文斯拉文提起這個(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萬美元。如...
摘要:為了講清復(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è)...
摘要:從視角理解系統(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ù),...
摘要:當(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ì)太多,這篇...
閱讀 1164·2021-11-24 09:39
閱讀 3631·2021-09-02 15:21
閱讀 2172·2021-08-24 10:01
閱讀 733·2021-08-19 10:55
閱讀 2458·2019-08-30 15:55
閱讀 1218·2019-08-30 14:16
閱讀 3001·2019-08-29 15:17
閱讀 3242·2019-08-29 13:53