Java中的遞增i++與++i的實(shí)現(xiàn)原理詳解
前言
在Java中,i++是一種常見的遞增操作符,用于將變量i的值增加1。
它是一種簡潔且方便的方式來實(shí)現(xiàn)循環(huán)和計(jì)數(shù)功能。i++可以用于各種情況,例如在for循環(huán)中迭代數(shù)組或列表的元素,或者在計(jì)數(shù)器中跟蹤某個(gè)事件的發(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,但是這 個(gè)時(shí)候棧頂元素沒有變化,還是0
14: istore_0 // 將棧頂元素出棧賦值給局部變量下標(biāo)0變量 也就 是i。 此時(shí) 局部變量 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 的舊值。則這個(gè)變量得到的是 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中動態(tài)地改變數(shù)組長度及數(shù)組轉(zhuǎn)Map的代碼實(shí)例分享
這篇文章主要介紹了Java中動態(tài)地改變數(shù)組長度及數(shù)組轉(zhuǎn)map的代碼分享,其中轉(zhuǎn)Map利用到了java.util.Map接口,需要的朋友可以參考下2016-03-03
Java線程狀態(tài)轉(zhuǎn)換的詳細(xì)過程
Java線程狀態(tài)轉(zhuǎn)換是Java多線程編程中的關(guān)鍵概念,對于理解和優(yōu)化并發(fā)程序至關(guān)重要,Java線程在其生命周期中經(jīng)歷多種狀態(tài),這些狀態(tài)之間的轉(zhuǎn)換是由線程調(diào)度器根據(jù)特定的策略來決定的,以下是對Java線程狀態(tài)轉(zhuǎn)換的詳細(xì)說明,需要的朋友可以參考下2025-09-09
springboot集成druid,多數(shù)據(jù)源可視化,p6spy問題
這篇文章主要介紹了springboot集成druid,多數(shù)據(jù)源可視化,p6spy問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Mybatis 中的sql批量修改方法實(shí)現(xiàn)
在項(xiàng)目中遇到需要批量更新的功能,原本想的是在Java中用循環(huán)訪問數(shù)據(jù)庫去更新,但是心里總覺得這樣做會不會太頻繁了,太耗費(fèi)資源了,效率也很低,查了下mybatis的批量操作,原來確實(shí)有<foreach>標(biāo)簽可以做到,下面通過本文給大家介紹下2017-01-01

