• Java 栈帧的一个面试题


    题目

    int a = 7 ;
    a = a++ ;
    System.out.println(a);
    int i = 7 ;
    i = ++i ;
    System.out.println(i);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    问执行这段代码后执行的结果。

    分析

    先来看看 ++i 和 i++ 的区别。

    在这里插入图片描述
    这里先说明栈帧的概念。学过编译原理的同学应该知道,程序的执行其实不断入栈出栈的过程。Java 的栈中,
    是以栈为单位执行的,当执行一个方法的时候,就会向栈中压一个栈帧,此方法的所有操作都是在此栈帧中
    执行完成的。栈帧中,有局部变量表和操作数栈这两个非常重要的概念。

    局部变量表是保存<变量名称 ,变量值> 对应关系的表格,方法中的局部变量都回保存在这里里面的,变更
    局部变量的值,就是变更局部变量表的值。

    操作数栈是执行赋值、计算、逻辑判断的辅助结构,例如,int c = a + b

    会先从局部变量表中,取出 a ,并将 a 的值压入到操作数栈中,对 b 执行类似的操作,遇到 + 号后,将 a 和
    b 的值出栈,应该是放到寄存器里面了,然后在加法器计算加法。结果压栈,然后结果出栈,并保存 c 的值
    到局部变量表中。

    i = ++i 的执行过程:

    1. 先计算 ++i ,执行 ++i 的操作,9 入栈
    2. 然后再将栈中的 9 写入 i 的局部变量表中

    i = i++ 的执行过程:

    1. 执行 i++ 的操作,8 入栈
    2. 然后再将 8 写入到 i 的局部变量表中

    ++i 是先在局部变量表中+1,然后压栈。
    i-- 是先压栈,然后再再局部变量表中 +1 。

    这就造成了结果的不同。

  • 相关阅读:
    什么是PLC?
    Intellij Idea使用技巧
    LeetCode216组合总和3
    微软总裁:元宇宙概念应避免炒作,科技行业需配合监管机构
    Git使用总结
    面了一个测试工程师要求月薪26K,总感觉他背了很多面试题...
    获取不到变量的值
    浅拷贝和深拷贝
    关于将预留单中增强字段带入物料凭证和会计凭证中
    C语言百日刷题第八天
  • 原文地址:https://blog.csdn.net/bluedraam_pp/article/details/126305607