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,又會輸出1,這是由于i++是先賦值,再計算導(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ù)值存入第二個本地變量(變量就是i)
2: iinc 將指定int型變量增加指定值(如i++, i--, i+=2等)
5: return
上圖是i++的字節(jié)碼,++i的和i++的一摸一樣,0和1就是最基礎(chǔ)的給i賦值為0,iinc就是把i自增。
但是如果加上一個i=i++呢?
// i = i++; public static void main(java.lang.String[]); Code: 0: iconst_0 將int型0推送至棧頂 1: istore_1 將棧頂int型數(shù)值存入第二個本地變量 2: iload_1 將第二個int型本地變量推送至棧頂 3: iinc 將指定int型變量增加指定值(如i++, i--, i+=2等) 6: istore_1 將棧頂int型數(shù)值存入第二個本地變量 7: return
0和1依舊是給i賦值為0,2是把當(dāng)前i的值推送到棧頂,然后iinc對局部變量表的i進(jìn)行自增,6是把棧頂?shù)臄?shù)值賦給i,注意,2的時候推送到棧頂?shù)氖?,所以又變回0了。
// i = ++i public static void main(java.lang.String[]); Code: 0: iconst_0 將int型0推送至棧頂 1: istore_1 將棧頂int型數(shù)值存入第二個本地變量 2: iinc 將指定int型變量增加指定值(如i++, i--, i+=2等) 5: iload_1 將第二個int型本地變量推送至棧頂 6: istore_1 將棧頂int型數(shù)值存入第二個本地變量 7: return
i = ++i的時候,iinc往前提了一步,說明,在i的值被壓到棧頂前,先進(jìn)行了自增,所以棧頂?shù)闹凳?,此時再賦值給局部變量表的里i,就是自增過的。
總結(jié):iinc操作是直接針對局部變量表的,不經(jīng)過操作棧,i++所謂的先賦值,從字節(jié)碼層面來看,就是i在進(jìn)行自增前,先把原來的值存到了操作數(shù)棧,所以如果執(zhí)行b = i++,b之所以等于是i原來的值,就是由于操作數(shù)棧的值是自增前的值,而++i的,自增操作提前了,所以b=++i后,b的值和i的值一樣。
總結(jié)
到此這篇關(guān)于java中i = i++和i =++i的文章就介紹到這了,更多相關(guān)java中i = i++和i =++i內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springBoot 插件工具熱部署 Devtools的步驟詳解
這篇文章主要介紹了springBoot 插件工具 熱部署 Devtools,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
SpringCloud?服務(wù)注冊中的nacos實(shí)現(xiàn)過程
這篇文章主要介紹了SpringCloud?服務(wù)注冊之nacos實(shí)現(xiàn)過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
關(guān)于Springboot2.x集成lettuce連接redis集群報超時異常Command timed out afte
這篇文章主要介紹了Springboot2.x集成lettuce連接redis集群報超時異常Command timed out after 6 second(s),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-03-03
SpringBoot中使用com.alibaba.druid.filter.config.ConfigTools對數(shù)據(jù)庫
這篇文章主要介紹了SpringBoot中使用com.alibaba.druid.filter.config.ConfigTools對數(shù)據(jù)庫密碼加密的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解
本篇文章主要介紹了Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
SpringBoot通過源碼探究靜態(tài)資源的映射規(guī)則實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot通過源碼探究靜態(tài)資源的映射規(guī)則實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05

