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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值