java中i = i++和i =++i的深入講解
public class Count { public static void main(String[] args) { int i = 0; i = i++ ; System.out.println(i); } }
上面代碼輸出的i為0,如果是把i = i++換成i=++i,又會輸出1,這是由於i++是先賦值,再計算導致,但是為什麼先賦值呢?
public static void main(String[] args) { int i = 0; i++ ; } public static void main(java.lang.String[]); Code: 0: iconst_0 將int型0推送至棧頂(找到0) 1: istore_1 將棧頂int型數值存入第二個本地變量(變量就是i) 2: iinc 將指定int型變量增加指定值(如i++, i--, i+=2等) 5: return
上圖是i++的字節碼,++i的和i++的一摸一樣,0和1就是最基礎的給i賦值為0,iinc就是把i自增。
但是如果加上一個i=i++呢?
// i = i++; public static void main(java.lang.String[]); Code: 0: iconst_0 將int型0推送至棧頂 1: istore_1 將棧頂int型數值存入第二個本地變量 2: iload_1 將第二個int型本地變量推送至棧頂 3: iinc 將指定int型變量增加指定值(如i++, i--, i+=2等) 6: istore_1 將棧頂int型數值存入第二個本地變量 7: return
0和1依舊是給i賦值為0,2是把當前i的值推送到棧頂,然後iinc對局部變量表的i進行自增,6是把棧頂的數值賦給i,註意,2的時候推送到棧頂的是0,所以又變回0瞭。
// i = ++i public static void main(java.lang.String[]); Code: 0: iconst_0 將int型0推送至棧頂 1: istore_1 將棧頂int型數值存入第二個本地變量 2: iinc 將指定int型變量增加指定值(如i++, i--, i+=2等) 5: iload_1 將第二個int型本地變量推送至棧頂 6: istore_1 將棧頂int型數值存入第二個本地變量 7: return
i = ++i的時候,iinc往前提瞭一步,說明,在i的值被壓到棧頂前,先進行瞭自增,所以棧頂的值是1,此時再賦值給局部變量表的裡i,就是自增過的。
總結:iinc操作是直接針對局部變量表的,不經過操作棧,i++所謂的先賦值,從字節碼層面來看,就是i在進行自增前,先把原來的值存到瞭操作數棧,所以如果執行b = i++,b之所以等於是i原來的值,就是由於操作數棧的值是自增前的值,而++i的,自增操作提前瞭,所以b=++i後,b的值和i的值一樣。
總結
到此這篇關於java中i = i++和i =++i的文章就介紹到這瞭,更多相關java中i = i++和i =++i內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 淺談JVM 底層解析 i++和 ++i 區別
- java中a=a+1和a+=1的區別介紹
- Java虛擬機運行時棧的棧幀
- 詳細圖解Java中字符串的初始化
- Java 匯編JVM編寫jasmin程序的操作方法