Java中的遞增i++與++i的實現(xiàn)原理詳解
前言
在Java中,i++是一種常見的遞增操作符,用于將變量i的值增加1。
它是一種簡潔且方便的方式來實現(xiàn)循環(huán)和計數(shù)功能。i++可以用于各種情況,例如在for循環(huán)中迭代數(shù)組或列表的元素,或者在計數(shù)器中跟蹤某個事件的發(fā)生次數(shù)。
通過使用i++,我們可以輕松地實現(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í)行上述代碼輸出結果是0,而不是50
0
對應字節(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 // 把局部變量下標0的變量加載到操作數(shù)棧上
11: iinc 0, 1 // 對局部變量表表為0的int變量直接加1,但是這 個時候棧頂元素沒有變化,還是0
14: istore_0 // 將棧頂元素出棧賦值給局部變量下標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);
}
}對應字節(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 // 把局部變量下標0的變量加載到操作數(shù)棧上
14: istore_0 // 將棧頂元素出棧賦值給局部變量下標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 , 先對局部變量表下標為0的變量加 1 ,然后才把它加載到操作數(shù)棧上,隨后又從操作數(shù)棧上出棧賦值給局部變量表中下標為 0 的變量

總結
- i++ 即后加加,原理是:先自增,然后返回自增之前的值、
- ++i 即前加加,原理是:先自增,然后返回自增之后的值
到此這篇關于Java中的遞增i++與++i的實現(xiàn)原理詳解的文章就介紹到這了,更多相關i++與++i的實現(xiàn)原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java+opencv3.2.0實現(xiàn)hough圓檢測功能
這篇文章主要為大家詳細介紹了Java+opencv3.2.0實現(xiàn)hough圓檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
postman中實現(xiàn)傳遞@RequestBody參數(shù)
這篇文章主要介紹了postman中實現(xiàn)傳遞@RequestBody參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10

