分析一下简单的两行代码

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,双非大四,Java实习中…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:接下来的三个月里,对梦想的追逐 ");

我们先看一下代码,你的答案是0还是1呢?

public class JvmTest {
    public static void main(String [] args) {
        int i = 0;
        i = i++;
        System.out.println(i);

    }
}

最终的输出结果是0

结果为什么是0呢? 肯定很疑惑
这里我们看一下对应的字节码文件,就很清楚了’

         0 iconst_0 将常量值0压入操作数栈中
         1 istore_1 将栈顶的值存储到局部变量表数组1的位置(将0存储到变量1,操作是将栈顶元素弹出,操作栈中没有这个值了)
         2 iload_1  将局部变量1的值加载到操作数栈中(将局部变量表数组下标1的值加载到操作栈中,变量表中的值依旧存在)
         3 iinc 1 by 1 将局部变量1的值增加1(比较特殊,直接将局部变量的值+1,而不是栈中的值,此时局部变量i为1)
         6 istore_1 将栈顶的值存储到局部变量表数组1的位置(这时栈顶的0弹出将局部变量i的值1覆盖)
         7 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;> 从类的常量池中获取 System.out 的静态字段
        10 iload_1 将局部变量1的值加载到操作数栈中
        11 invokevirtual #3 <java/io/PrintStream.println : (I)V> 将栈顶的整数值作为参数传递给该方法
        14 return 表示方法返回

主要原因是iinc 1 by 1操作在 istore_1 的操作之前,导致1被0所覆盖掉了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码不会敲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值