JVM 使用javap反编译命令解释i++和++i的区别

本文通过一个简单的例子,利用JVM的javap反编译命令,详细分析了'i++'和'++i'在执行过程中的区别。在示例中,'i++'操作并未改变变量i的值,而'++i'则导致变量i的值增加。同时,对于变量j和k也进行了类似的分析,展示了它们在执行iinc指令后的变化。
摘要由CSDN通过智能技术生成

一个简单的例子

public class Test{
    public static void main(String[] args){
        int i = 0;
        int j = 1;
        int k = 2;
        i = i++;        
        j = ++j;
        k += 2;
    }
}

输出结果我们知道是

0
2
4

使用javap命令反编译一下

这里写图片描述

分析一下得到的输出结果

public static void main(java.lang.String[]);
    Code:
       0: iconst_0
       1: istore_1
       2: iconst_1
       3: istore_2
       4: iconst_2
       5: istore_3
       6: iload_1
       7: iinc          1, 1
      10: istore_1
      11: iinc          2, 1
      14: iload_2
      15: istore_2
      16: iinc          3, 2
      19: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      22: iload_1
      23: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      26: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      29: iload_2
      30: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      33: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      36: iload_3
      37: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      40: return
}

前面6条指令分别给i,j,k变量进行赋值,即
0: iconst_0—–把常量0入栈
1: istore_1——把栈顶元素(0)存入第一个变量i中
2: iconst_1—–把常量1入栈
3: istore_2—–把栈顶元素(1)存入第二个变量j中
4:iconst_2—–把常量2入栈
5: istore_3—–把栈顶元素(2)存入第三个变量k中

接下来的
6,7,10对应的代码是i = i++;
6: iload_1——把第一个变量的值压入栈
7:iinc 1, 1——第一个变量的值加1
10: istore_1——把栈顶元素存入第一个变量i

我们可以知道这里的操作类似于

int temp = i;
i = i+1;
i = temp;

因此i的值并没有发生变化

11,14,15对应的是j = ++j;

11: iinc 2, 1—–把第二个变量j的值加1
14: iload_2—-把第二个变量是j的值压入栈
15: istore_2—-把栈顶元素存入第二个变量j中

操作类似于

i = i+1;
int temp = i;
i = temp;

j的值是发生了改变的

16对应的就是k += 2;

16: iinc 3, 2—把第三变量的值加二

因此k的值是4


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值