关于i++的面试题

作者: 我犟不过你 | 来源:发表于2021-06-01 17:57 被阅读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

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

相关文章

  • 关于i++的面试题

    有如下一道题目,请给出输出结果: 下面直接给出结果: 过程分析,这道题主要涉及到我们关于jvm方法执行字节码的过程...

  • 关于 i=i++;

    提起后缀式的 i++,我最常听的一句总结就是 后缀模式:先返回,后自增。 但是对于这句话,反映出的意思却并不明朗。...

  • 自增、赋值运算符

    1.自增 int i = 3; int a = i++ + i++ + i++;//第①个i++表达是值为3,i=...

  • 2019-01-03今日内容

    面试题 1.i++和++i有什么区别哪一个效率高。 区别:i++ 是先赋值,后加减;++ 是先加减,后赋值。效率:...

  • 某疆笔试

    题型 选择单选多选 问答 选择 1、int i=2; int x=(i++)+(i++)+(i++);x=? x=...

  • 谈一谈 面试题中套路深

    关于面试题 今天要聊的主题是关于面试题这个话题的讨论。 大家就免不了遇到各种面试题,对于开发职位来说,笔试题就是经...

  • the go programming language note

    Chapter 1 1.2 i++ is statement, so j = i++ is illegals :=...

  • Java中的i++ 和 ++i 在for循环使用

    Java的i++ 和++i 的区别i++:先赋值,后计算;++i;先计算,后赋值。 for循环中的i++和++i...

  • 关于i++和++i 的详解

    闲暇之余,发现自己对于i++和++i的观念变得模糊些许,所以今天又研究了下。废话不多说,本文参考了一些文章的解释,...

  • 进程和内存的桥梁——页表技术(x86-64Linux下)

    其实这篇文章是printf("%d%d%d",i++,i++,i++)的后续。 需要注意的名词: 地址空间和内存空...

网友评论

    本文标题:关于i++的面试题

    本文链接:https://www.haomeiwen.com/subject/scqgsltx.html