先寫一段java測試代碼
public void testInc() {
int i = 0;
int b = i++;
int c = ++i;
}
編譯成jvm指令后如下:
0 iconst_0 // 將常量0入棧
1 istore_1 // 將棧頂?shù)膇數(shù)據(jù)出棧保存到局部變量表索引為1的位置
2 iload_1 // 將局部變量表索引為1的變量入棧
3 iinc 1 by 1 // 局部變量表索引為1的變量遞增
6 istore_2 // 將棧頂?shù)臄?shù)據(jù)保存到局部變量表索引為2的位置
7 iinc 1 by 1 // 局部變量表索引為1的變量遞增
10 iload_1 // 將局部變量表索引為1的變量入棧
11 istore_3 // 將棧頂?shù)臄?shù)據(jù)保存到局部變量表索引為3的位置
12 return
數(shù)據(jù)變化過程是這樣子的:
開始前:i未初始化;b未初始化摊沉;c未初始化狐史;操作數(shù)棧=[];
0行指令: i、b、c保持不變骏全;操作數(shù)棧=[0];
1行指令: i=0苍柏;b、c保持不變姜贡;操作數(shù)棧=[];
2行指令:i=0试吁;b、c保持不變楼咳;操作數(shù)棧=[0];
3行指令:i=1熄捍;b、c保持不變爬橡;操作數(shù)棧=[0];
6行指令:i=1治唤;b=0;c保持不變糙申;操作數(shù)棧=[];
7行指令:i=2宾添;b=0;c保持不變柜裸;操作數(shù)棧=[];
6行指令:i=2缕陕;b=0;c保持不變疙挺;操作數(shù)棧=[2];
7行指令:i=2扛邑;b=0;c=2铐然;操作數(shù)棧=[];
總結:
共同點:都是先將局部變量入棧蔬崩,然后出棧保存到局部變量表。
不同點:i++是先入棧再遞增搀暑;i++是先遞增再入棧沥阳。