App下載

總結(jié)歸納java中i=i++和j=i++的區(qū)別

猿友 2021-07-20 14:31:29 瀏覽數(shù) (3031)
反饋

各位小伙伴們?cè)?java 語(yǔ)言中運(yùn)用 i=i++; 或 j=i++; 的時(shí)候,只是知其然而不知其所以然,他們倆之間有什么區(qū)別?在內(nèi)存中是怎么運(yùn)行的?接下來(lái),我將和大家一起分享一下關(guān)于以上兩個(gè)問(wèn)題的內(nèi)容。

i=i++;j=i++的區(qū)別

i=i++-----------在java中 這個(gè)語(yǔ)句的前后順序應(yīng)該是這樣的(tmp=i;i++;tmp==i)

java的編譯器在遇到i++和i- -的時(shí)候會(huì)重新為變量運(yùn)算分配一塊內(nèi)存空間,以存放原始的值,而在完成了賦值運(yùn)算之后,將這塊內(nèi)存釋放掉,下面首先看一下如果是j=i++的情況:

 202104121038084

i的原始值存放在后開(kāi)辟的內(nèi)存中,最后這個(gè)值將賦值給j,這樣j=i++后,j就會(huì)得到i的值,而i又將自加,所以,在釋放內(nèi)存之后,原來(lái)存放j和i的地方將得到值將是:j(此時(shí)的值等于初始i值)和i(i自加后的值)。

看看i=i++的情況:

 202104121038085

i的原始值存放在后開(kāi)辟的內(nèi)存中,給剛開(kāi)始的i進(jìn)行自加,最后再將后面內(nèi)存中的i賦給剛開(kāi)始的i.

我們來(lái)看看這兩個(gè)程序反編譯的結(jié)果

這個(gè)是i=i++; 

 202104121038086

1:   iconst_0   整型常量值0進(jìn)棧

2:   istore_1   將棧頂整型數(shù)值存入第二個(gè)局部變量

3:   iload_1  第二個(gè)整型局部變量進(jìn)棧

4:   iinc    1, 1 指定整型變量增加指定值

5:   istore_1  將棧頂整型數(shù)值存入第二個(gè)局部變量

 j = i++;

202104121038087

反編譯后是這樣的

7:   iconst_0  整型常量值0進(jìn)棧

8:   istore_1  將棧頂整型數(shù)值存入第二個(gè)局部變量

9:   iconst_0  整型常量值0進(jìn)棧

10:  istore_2 將棧頂整型數(shù)值存入第三個(gè)局部變量

11:  iload_2  第三個(gè)整型局部變量進(jìn)棧

12:  iinc    2, 1 指定整型變量增加指定值

15:  istore_1  將棧頂整型數(shù)值存入第二個(gè)局部變量

總結(jié)

到此這篇關(guān)于 java 中 i=i++ 和 j=i++ 區(qū)別的文章就介紹到這了,想要了解更多相關(guān) java 其他的內(nèi)容請(qǐng)搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持!


0 人點(diǎn)贊