java中i = i++和i =++i的深入講解
public class Count { public static void main(String[] args) { int i = 0; i = i++ ; System.out.println(i); } }
上面代碼輸出的i為0,如果是把i = i++換成i=++i,又會(huì)輸出1,這是由于i++是先賦值,再計(jì)算導(dǎo)致,但是為什么先賦值呢?
public static void main(String[] args) { int i = 0; i++ ; } public static void main(java.lang.String[]); Code: 0: iconst_0 將int型0推送至棧頂(找到0) 1: istore_1 將棧頂int型數(shù)值存入第二個(gè)本地變量(變量就是i) 2: iinc 將指定int型變量增加指定值(如i++, i--, i+=2等) 5: return
上圖是i++的字節(jié)碼,++i的和i++的一摸一樣,0和1就是最基礎(chǔ)的給i賦值為0,iinc就是把i自增。
但是如果加上一個(gè)i=i++呢?
// i = i++; public static void main(java.lang.String[]); Code: 0: iconst_0 將int型0推送至棧頂 1: istore_1 將棧頂int型數(shù)值存入第二個(gè)本地變量 2: iload_1 將第二個(gè)int型本地變量推送至棧頂 3: iinc 將指定int型變量增加指定值(如i++, i--, i+=2等) 6: istore_1 將棧頂int型數(shù)值存入第二個(gè)本地變量 7: return
0和1依舊是給i賦值為0,2是把當(dāng)前i的值推送到棧頂,然后iinc對(duì)局部變量表的i進(jìn)行自增,6是把棧頂?shù)臄?shù)值賦給i,注意,2的時(shí)候推送到棧頂?shù)氖?,所以又變回0了。
// i = ++i public static void main(java.lang.String[]); Code: 0: iconst_0 將int型0推送至棧頂 1: istore_1 將棧頂int型數(shù)值存入第二個(gè)本地變量 2: iinc 將指定int型變量增加指定值(如i++, i--, i+=2等) 5: iload_1 將第二個(gè)int型本地變量推送至棧頂 6: istore_1 將棧頂int型數(shù)值存入第二個(gè)本地變量 7: return
i = ++i的時(shí)候,iinc往前提了一步,說(shuō)明,在i的值被壓到棧頂前,先進(jìn)行了自增,所以棧頂?shù)闹凳?,此時(shí)再賦值給局部變量表的里i,就是自增過(guò)的。
總結(jié):iinc操作是直接針對(duì)局部變量表的,不經(jīng)過(guò)操作棧,i++所謂的先賦值,從字節(jié)碼層面來(lái)看,就是i在進(jìn)行自增前,先把原來(lái)的值存到了操作數(shù)棧,所以如果執(zhí)行b = i++,b之所以等于是i原來(lái)的值,就是由于操作數(shù)棧的值是自增前的值,而++i的,自增操作提前了,所以b=++i后,b的值和i的值一樣。
總結(jié)
到此這篇關(guān)于java中i = i++和i =++i的文章就介紹到這了,更多相關(guān)java中i = i++和i =++i內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序微信登錄的實(shí)現(xiàn)方法詳解(JAVA后臺(tái))
通常我們?cè)诘卿浳⑿判〕绦虻臅r(shí)候都是通過(guò)授權(quán)登錄,下面這篇文章主要給大家介紹了關(guān)于微信小程序微信登錄的實(shí)現(xiàn)方法,文中通過(guò)實(shí)例代碼介紹的介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07Spring?Cloud?Alibaba使用Nacos作為注冊(cè)中心和配置中心
這篇文章主要為大家介紹了Spring?Cloud?Alibaba使用Nacos作為注冊(cè)中心和配置中心的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Java實(shí)現(xiàn)導(dǎo)出pdf格式文件的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)導(dǎo)出pdf格式文件的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02關(guān)于為何說(shuō)JAVA中要慎重使用繼承詳解
Java繼承是面向?qū)ο蟮淖铒@著的一個(gè)特征,然而下面這篇文章主要給大家介紹了關(guān)于為何說(shuō)JAVA中要慎重使用繼承的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08springboot實(shí)現(xiàn)添加郵件發(fā)送及壓縮功能
這篇文章主要介紹了springboot實(shí)現(xiàn)添加郵件發(fā)送及壓縮功能 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07Java使用線程池批量處理數(shù)據(jù)操作具體流程
這篇文章主要給大家介紹了關(guān)于Java使用線程池批量處理數(shù)據(jù)操作的相關(guān)資料,Java多線程編程中線程池是一個(gè)非常重要的概念,線程池可以提高線程的復(fù)用率和任務(wù)調(diào)度的效率,尤其是當(dāng)需要查詢大批量數(shù)據(jù)時(shí),需要的朋友可以參考下2023-06-06