JavaSE面试题01:自增变量

反转基因福娃  金牌会员 | 2023-12-31 19:51:52 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 933|帖子 933|积分 2799

JavaSE面试题:自增变量
来源:https://runwsh.com/

  • 代码
  1.     public static void main(String[] args) {
  2.         int i=1;
  3.         i=i++;
  4.         int j=i++;
  5.         int k=i + ++i * i++;
  6.         System.out.println("i="+i);
  7.         System.out.println("j="+j);
  8.         System.out.println("k="+k);
  9.     }
复制代码

  • 现在,让我们逐行解释这段代码的执行
1.  int i = 1;:创建整数变量 i 并将其初始化为1。(i=1;)
2.  i = i++;:这是一个有争议的表达式。首先,它将 i 的当前值1压栈到一个操作数栈中。然后,它将 i 自增1,这就使得变量i=2了,但右边的操作数栈不是没有后续的逻辑运算了,就会将之前压到操作数栈的1赋值给i。所以,i 的值又变为了1。(i=1;)

    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。
打印结果:
  1. i=4
  2. j=1
  3. k=11
复制代码
小结



    • 赋值=,最后计算


    • =右边的从左到右加载值依次压入操作数栈


    • 实际先算哪个,看运算符优先级


    • 自增、自减操作都是直接修改变量的值,不经过操作数栈


    • 最后的赋值之前,临时结果也是存储在操作数栈中

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

反转基因福娃

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表