1、從字節碼角度分析count++
// 先看下count++的代碼
public class TestCount{
public static void main(String[] args) {
int count = 0;
int result = count++;
System.out.println(result); // result = 0
}
}
再來看看count++的相關字節碼,如下:
public class com.pt.test.TestCount {
public com.pt.test.TestCount();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 // 將int常量0壓入操作數棧
1: istore_1 // 將操作數棧頂元素彈出寫入到本地變量表索引爲1的位置
2: iload_1 // 又將本地變量表索引爲1的數值壓入操作數棧
3: iinc 1, 1 // 注意:是將位於本地變量表的count進行了一個自增操作
6: istore_2 // 將操作數棧棧頂元素彈出,寫入到索引爲2的位置,(也就是說result=0)
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_2 // 再將本地變量表索引爲2的數值壓入操作數棧
11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
14: return
}
通過上面count++的相關字節碼分析可以看到,result = count++是一個先將常量count=0壓棧,然後將棧頂元素彈出寫入到本地變量,然後又將本地變量的數值壓棧,然後本地變量自增1,再將棧頂元素彈出寫到本地變量result內。而此時result還是爲0;
2、從字節碼角度分析++count:
// 先看下++count的代碼
public class TestCount{
public static void main(String[] args) {
int count = 0;
int result = ++count;
System.out.println(result); // result = 1
}
}
再來看下++count的相關字節碼,如下:
public class com.pt.test.TestCount {
public com.pt.test.TestCount();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 //將int常量0壓入操作數棧
1: istore_1 //將操作數棧頂元素彈出寫入到本地變量表索引爲1的位置
2: iinc 1, 1 // 注意:將位於本地變量表的count進行了一個自增操作
5: iload_1 //將本地變量表索引爲1的數值壓入操作數棧,即count自增以後的值入棧
6: istore_2 // 將操作數棧棧頂元素彈出,寫入到索引爲2的位置,(也就是說result=0)
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_2 //再將本地變量表索引爲2的數值壓入操作數棧
11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
14: return
}
通過上面++count的相關字節碼分析可以看到,result = ++count也是一個先將常量count=0壓棧,然後將棧頂元素彈出寫入到本地變量,然後本地變量自增1,然後又將本地變量的數值壓棧,再將棧頂元素彈出寫到本地變量result內。而此時result=1;
最後看下count++&++count的不同點:
count++是一個先將本地變量count=0壓棧,然後本地變量自增1,再將棧頂元素彈出寫到本地變量result內。result=0;
即首先將count的值存儲在一個臨時變量區,然後對count進行自增1,最後返回臨時變量區的值。
而++count是先將本地變量count自增1,然後再壓棧,最後將棧頂元素彈出寫到本地變量result內。此時result=1;
更多學習:
字節碼角度分析count++ & ++ count:
https://blog.csdn.net/f191501223/article/details/86754780
JVM字節碼指令學習: