JavaJava 核心技术JVM · Java虚拟机原理 · JVM上语言·框架· 生态系统

关于i++的面试题

2021-06-01  本文已影响0人  我犟不过你

有如下一道题目,请给出输出结果:

public class Test {

    public static void main(String[] args) {
        int i = 1;
        i = i++;
        int j = i++;
        int k = i+ ++i * i++;
        System.out.println(i);
        System.out.println(j);
        System.out.println(k);
    }
}

下面直接给出结果:

4
1
11

过程分析,这道题主要涉及到我们关于jvm方法执行字节码的过程,包含栈帧,操作数栈,局部变量表的内容。

   L0
    LINENUMBER 12 L0   #第12行
    ICONST_1           #定义i
    ISTORE 1           #将i值保存在局部变量表
   L1
    LINENUMBER 13 L1   #第13行
    ILOAD 1            #将i压入操作数栈
    IINC 1 1           #局部变量表的i进行++操作,变成2
    ISTORE 1           #将操作数栈的i放回到局部变量表中,此时1将2覆盖了,所以i值仍然是1
   L2
    LINENUMBER 14 L2   #第14行
    ILOAD 1            #将i压入操作数栈
    IINC 1 1           #局部变量表进行++操作,此时i变成了2
    ISTORE 2           #将操作数栈的值赋值给j,保存到局部变量表,此时j是1,i是2
   L3
    LINENUMBER 15 L3  #第15行
    ## 以下操作既有加法,又有++操作,还有乘法,但是变量入栈及程序执行顺序仍然是从左自右的
    ILOAD 1           #将第一个i压入操作数栈,值是2
    IINC 1 1          #执行++操作,此时局部变量表的i值变成了3
    ILOAD 1           #将第二个i压入栈,此时压入的i是3
    ILOAD 1           #将第三个I压入栈,压入的仍然是3
    IINC 1 1          #局部变量表的i再次进行++操作,此时i变成了4
    IMUL              #此时执行乘法指令,将栈顶的两个3进行相乘,得到9,此处没有赋值操作,所以将9压回操作数栈
    IADD              #将操作数栈的两个数值相加,即2 和 9 相加,得到 11
    ISTORE 3          # 将11赋值给局部变量表的k

总结:
自增自减操作直接修改局部变量表的值,不在操作数栈中操作。
运算符的先后顺序决定操作数栈先运行的命令
临时结果会压回操作数栈
变量都是从左至右依次入栈

上一篇 下一篇

猜你喜欢

热点阅读