Java | count++ & ++count

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字節碼指令學習:

https://blog.csdn.net/a15089415104/article/details/83275741

https://blog.csdn.net/a15089415104/article/details/83245568

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章