Java中的遞增i++與++i的實(shí)現(xiàn)原理詳解
前言
在Java中,i++是一種常見的遞增操作符,用于將變量i的值增加1。
它是一種簡潔且方便的方式來實(shí)現(xiàn)循環(huán)和計(jì)數(shù)功能。i++可以用于各種情況,例如在for循環(huán)中迭代數(shù)組或列表的元素,或者在計(jì)數(shù)器中跟蹤某個事件的發(fā)生次數(shù)。
通過使用i++,我們可以輕松地實(shí)現(xiàn)自增操作,而無需手動編寫i = i + 1的代碼。
i++
首先先看一段代碼
public class Test { public static void main(String[] args) { foo(); } public static void foo() { int i = 0; for (int j = 0; j < 50; j++) { i = i++; } System.out.println(i); } }
執(zhí)行上述代碼輸出結(jié)果是0,而不是50
0
對應(yīng)字節(jié)碼
public class com.yxzapp.Test { public com.yxzapp.Test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: invokestatic #2 // Method foo:()V 3: return public static void foo(); Code: 0: iconst_0 1: istore_0 2: iconst_0 3: istore_1 4: iload_1 5: bipush 50 7: if_icmpge 21 10: iload_0 // 把局部變量下標(biāo)0的變量加載到操作數(shù)棧上 11: iinc 0, 1 // 對局部變量表表為0的int變量直接加1,但是這 個時候棧頂元素沒有變化,還是0 14: istore_0 // 將棧頂元素出棧賦值給局部變量下標(biāo)0變量 也就 是i。 此時 局部變量 i 又被賦值為0,前面 iinc 指令對i 的加一操作一樣被覆蓋 15: iinc 1, 1 18: goto 4 21: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream; 24: iload_0 25: invokevirtual #4 // Method java/io/PrintStream.println:(I)V 28: return }
在字節(jié)碼層面是先把 i 加載到操作數(shù)棧上,隨后才對局部變量 i 執(zhí)行加一操作 , 留在操作數(shù)棧頂?shù)倪€是 i 的舊值。則這個變量得到的是 i 加一之前的值
++i
public class Test { public static void main(String[] args) { foo(); } public static void foo() { int i = 0; for (int j = 0; j < 50; j++) { i = ++i; } System.out.println(i); } }
對應(yīng)字節(jié)碼
public class com.yxzapp.Test { public com.yxzapp.Test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: invokestatic #2 // Method foo:()V 3: return public static void foo(); Code: 0: iconst_0 1: istore_0 2: iconst_0 3: istore_1 4: iload_1 5: bipush 50 7: if_icmpge 21 10: iinc 0, 1 // 對局部變量表表為0的int變量直接加1, 13: iload_0 // 把局部變量下標(biāo)0的變量加載到操作數(shù)棧上 14: istore_0 // 將棧頂元素出棧賦值給局部變量下標(biāo)0變量 15: iinc 1, 1 18: goto 4 21: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream; 24: iload_0 25: invokevirtual #4 // Method java/io/PrintStream.println:(I)V 28: return }
可以看出 i= ++i , 先對局部變量表下標(biāo)為0的變量加 1 ,然后才把它加載到操作數(shù)棧上,隨后又從操作數(shù)棧上出棧賦值給局部變量表中下標(biāo)為 0 的變量
總結(jié)
- i++ 即后加加,原理是:先自增,然后返回自增之前的值、
- ++i 即前加加,原理是:先自增,然后返回自增之后的值
到此這篇關(guān)于Java中的遞增i++與++i的實(shí)現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)i++與++i的實(shí)現(xiàn)原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java+opencv3.2.0實(shí)現(xiàn)hough圓檢測功能
這篇文章主要為大家詳細(xì)介紹了Java+opencv3.2.0實(shí)現(xiàn)hough圓檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02異常點(diǎn)/離群點(diǎn)檢測算法——LOF解析
這篇文章主要介紹了異常點(diǎn)/離群點(diǎn)檢測算法——LOF解析,通過圖解文字描述的方式詳細(xì)的解析了該算法,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù)
這篇文章主要介紹了postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10