JavaSE面试题01:自增变量

JavaSE面试题:自增变量

来源:https://runwsh.com/

  • 代码
java 复制代码
    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);
    }
  • 现在,让我们逐行解释这段代码的执行

1. int i = 1;:创建整数变量 i 并将其初始化为1。(i=1;)

2. i = i++;:这是一个有争议的表达式。首先,它将 i 的当前值1压栈到一个操作数栈中。然后,它将 i 自增1,这就使得变量i=2了,但右边的操作数栈不是没有后续的逻辑运算了,就会将之前压到操作数栈的1赋值给i。所以,i 的值又变为了1。(i=1;)

  如果是`i=++i`呢,就是入栈的时候就会将自增后的变量i压入栈中,变量i2,使得出栈的时候也是为2了。

3. int j = i++;:将 i 的当前值1赋给 j,然后将 i 自增1。所以,j 的值是1,而 i 的值变为2。(i=2;j=1)

4. int k = i + ++i * i++;:这是一个复杂的表达式。首先看右边的表达式,操作数栈会先将i变量入栈;也就是2先入栈,这个时候往右走++i,是将i自增后的数压入栈中,也就是3,然后再看下一个操作数是i++;记住一点的就是,++i压入栈中是将i自增后压入栈中;i++是将i变量压入栈中; ,记住这个规则就是,继续压入栈中的数字是3 。所以现在的操作数栈中的数据从栈低到栈顶依次为:2->3->3;按照运算符操作顺序先乘后加,2+3*3=11。

打印结果:

text 复制代码
i=4
j=1
k=11

小结

    1. 赋值=,最后计算
    1. =右边的从左到右加载值依次压入操作数栈
    1. 实际先算哪个,看运算符优先级
    1. 自增、自减操作都是直接修改变量的值,不经过操作数栈
    1. 最后的赋值之前,临时结果也是存储在操作数栈中

建议:《JVM虚拟机规范》关于指令的部分

相关推荐
悟空非空也1 个月前
挑战Java面试题复习第1天,坚持就是胜利
java·java面试题
前端玖耀里4 个月前
01. 课程简介
java·后端·后端面试·java面试题
zouhuu5 个月前
面试题006-Java-JVM(下)
java·jvm·java面试题·java虚拟机面试题
zouhuu5 个月前
面试题001-Java-Java基础
java·java面试·java面试题·java基础题
江-小北6 个月前
10W QPS高并发,如何防止重复下单?
java面试题·redis面试题
青云交6 个月前
Java面试题--JVM大厂篇(1-10)
jvm·java面试题·类加载器·java jvm·栈内存溢出·java内存模型(jmm)·minorgc与fullgc
猫鱼吐泡泡6 个月前
Java面试题:SpringBoot异常捕获,让程序“免疫”一切错误!
java·spring boot·面试题·java面试题·java基础面试题·spring面试·面试题java·史上最全java面试题·java开发面试题·多线程面试·springboot面试题
猫鱼吐泡泡6 个月前
Java面试题:Spring中的循环依赖,给程序员带来的心理阴影
java·面试题·java面试题·hashmap面试·java基础面试题·spring面试·面试题java·史上最全java面试题·2024年java面试·java开发面试题·多线程面试·数据库面试
猫鱼吐泡泡6 个月前
Java面试题:让依赖注入变得简单,面对@Autowired和@Resource,该如何选择?
java·面试题·java面试题·java基础面试题·spring面试·面试题java·史上最全java面试题·2024年java面试·java开发面试题·多线程面试
猫鱼吐泡泡6 个月前
Java面试题:Spring框架除了IOC和AOP,还有哪些好玩的设计模式?
java·面试题·java面试题·java基础面试题·spring面试·面试题java·史上最全java面试题·2024年java面试·java开发面试题·多线程面试