一道i++ 和++i 考验Java底层知识

一道i++ 和++i 考验Java底层知识

/**
 * @author wasai
 * @date 2021-03-09 17:47:30
 */
public class ADDSUBTest {
    public static void main(String[] args) {
        int i = 1;
        i = i++;
        int j = i++;
        int k = i + ++i * i++;
        System.out.println("i = "+i);
        System.out.println("j = "+j);
        System.out.println("k = "+k);
    }
}
结果:
i = 4
j = 1
k = 11

考察知识点

JVM内存模型
想要彻底搞明白我们就需要了解几个概念:

  1. 栈帧:栈帧是每个线程私有的,其实就对应这一个方法,在一个线程中每个方法都会对应一个栈帧,当方法执行完毕后栈帧就消失。
  2. 局部变量表:可以理解为方法中的变量都是存在这个地方的。
  3. 操作数栈:方法中的计算操作都是在这里完成的。
  4. 注意:变量的++,-- 操作都是直接改变的局部变量表中完成的。(这对于这道题的理解非常重要)

接下来就可以看这道题了:

public class ADDSUBTest {
    public static void main(String[] args) {
        //向局部变量表中放入了i=1
        int i = 1;
        
        //第一步:将局部变量表中i的值压入操作数栈 此时操作数栈中的值是1
        //第二步:对i进行++,局部变量表表中的i变为2(++ -- 操作都是直接改变局部变量表中的值)
        //第三步:将操作数栈中的值付赋给局部变量中的i,此时局部变量中的i变为1
        i = i++;
        
        //第一步:将局部变量表中i的值压入操作数栈 此时操作数栈中的值是1
        //第二步:对i进行++,局部变量表表中的i变为2 (++ -- 操作都是直接改变局部变量表中的值)
        //第三步:将操作数栈中的值付赋给局部变量中的j,此时局部变量中的i变为2,j为1
        int j = i++;
        
        //像这种复杂计算,过程其实就是先将数和符号压入操作数栈,最后计算
        //第一步:将局部变量表中的i压入操作数栈,i的值为2
        //第二步:由于是++i,则先加再压入操作数栈,则操作数中又压入3
        //第三步:先向操作数栈压入3,然后对i进行++,局部变量表中i的值又变为4l
        //最后操作数栈中其实就是 2 + 3 * 3 算出来等于11,然后赋值给局部变量表中的k。
        int k = i + ++i * i++;
        //局部变量表中的值:i=4 j=1 k=11
        System.out.println("i = "+i);
        System.out.println("j = "+j);
        System.out.println("k = "+k);
    }
}

深入研究:通过javap命令可以看到class文件的反编译文件,可以大概看清楚过程。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值