Java中的遞增i++與++i的實(shí)現(xiàn)原理詳解
前言
在Java中,i++是一種常見(jiàn)的遞增操作符,用于將變量i的值增加1。
它是一種簡(jiǎn)潔且方便的方式來(lái)實(shí)現(xiàn)循環(huán)和計(jì)數(shù)功能。i++可以用于各種情況,例如在for循環(huán)中迭代數(shù)組或列表的元素,或者在計(jì)數(shù)器中跟蹤某個(gè)事件的發(fā)生次數(shù)。
通過(guò)使用i++,我們可以輕松地實(shí)現(xiàn)自增操作,而無(wú)需手動(dòng)編寫(xiě)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
對(duì)應(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 // 對(duì)局部變量表表為0的int變量直接加1,但是這 個(gè)時(shí)候棧頂元素沒(méi)有變化,還是0
14: istore_0 // 將棧頂元素出棧賦值給局部變量下標(biāo)0變量 也就 是i。 此時(shí) 局部變量 i 又被賦值為0,前面 iinc 指令對(duì)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ù)棧上,隨后才對(duì)局部變量 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);
}
}對(duì)應(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 // 對(duì)局部變量表表為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 , 先對(duì)局部變量表下標(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MybatisX-Generator自動(dòng)代碼生成插件教程
這篇文章主要介紹了MybatisX-Generator自動(dòng)代碼生成插件教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Java+opencv3.2.0實(shí)現(xiàn)hough圓檢測(cè)功能
這篇文章主要為大家詳細(xì)介紹了Java+opencv3.2.0實(shí)現(xiàn)hough圓檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
異常點(diǎn)/離群點(diǎn)檢測(cè)算法——LOF解析
這篇文章主要介紹了異常點(diǎn)/離群點(diǎn)檢測(cè)算法——LOF解析,通過(guò)圖解文字描述的方式詳細(xì)的解析了該算法,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù)
這篇文章主要介紹了postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

