前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试细节: i = i++和 i = ++i

面试细节: i = i++和 i = ++i

作者头像
Java小咖秀
修改2020-07-06 10:29:49
1.8K0
修改2020-07-06 10:29:49
举报
文章被收录于专栏:Java冰冻三尺Java冰冻三尺

作者:默辩

来源:https://blog.csdn.net/qq_44377709/article/details/106643703

一般来说,这个类题,可能会出现在笔试题,还是很高频的~

如果面试官真的问了,那这个问题还是很细节的,一起看下文吧~

写在前面:前些天看完了JVM的内存结构,自以为自己是懂了,心里想想不就是分线程共享和线程私有嘛,然后又怎么怎么分怎么怎么的嘛…直到遇到了这道题目。说句实话,曾经自己做这种运算题目,完全是靠脑子空想,然后拿上笔颤抖的写下一个自己都不知道正不正确的答案。不过过了今天,我终于能确定它的答案了。

为此,我也专门写一篇博客,记录我的学习!!!

1、题目

代码语言:txt
复制
package pers.mobian.questions01;

public class test01 {
    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);
    }
}

你能肯定并且准确的说出你的答案吗?

2、分析

在做这道题时我们的脑中要有对应的JVM内存结构。其中一个方法对应一个栈帧

此题目我们只需要用到栈帧里面的局部变量表和操作数栈

2.1、第一步
代码语言:txt
复制
int i = 1

只是一个简单的赋值操作

2.2、第二步
代码语言:txt
复制
i = i++

结果:i还是等于1

2.3、第三步
代码语言:txt
复制
int j = i++

`结果:i在局部变量表中变成了2,操作数栈中的 i 值为1,并且将 i 的值返回给 j,即此条语句以后,i = 2,j = 1

`

2.4、第四步
代码语言:txt
复制
int k = i + ++i * i++

结果:局部变量表中的i = 4,k = 11

2.5、结果

3、i = ++i

按理说根据上面的分析过程,再来分析 i = ++i,就很简单了。

我们的 i 变量先在局部变量表中进行自增,然后再将 i 进栈,然后再把栈中的数据返回给我们的变量 i 。

代码语言:txt
复制
public class test02 {
    public static void main(String[] args) {
        int i = 1;
        i = ++i;
        System.out.println(i); // 结果:i = 2
    }
}

`最后的最后:本文的思考过程和计算推导仅针对Java语言

`

微信搜索:【Java小咖秀】更多精彩等着您~

回复手册获取博主15万字Java面试通关手册&2万字Linux命令实战书册~

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、题目
  • 2、分析
    • 2.1、第一步
      • 2.2、第二步
        • 2.3、第三步
          • 2.4、第四步
            • 2.5、结果
            • 3、i = ++i
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档