彻底搞懂++i,i++再也不迷糊

·  阅读 105
彻底搞懂++i,i++再也不迷糊

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

昨天发布了一篇文章,其中介绍了++ii++部分知识,而且小编还把标题写错了😭😭,今天刚好看到关于这个方面的文章,我这边就再发一篇关于++ii++的文章让大家测底明白。

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

一、题目

public class test1 {
    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);
    }
}
复制代码

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

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

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

  • 2.1、第一步
int i = 1;
复制代码

只是一个简单的赋值操作

  • 2.2、第二步
i = i++;
复制代码

结果:i还是等于1

  • 2.3、第三步
int j = i++;
复制代码

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

  • 2.4、第四步
int k = i + ++i * i++;
复制代码

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

  • 2.5、结果
i=4
j=1
k=11
复制代码

三、i = ++i

按理说根据上面的分析过程,再来分析 i = ++i,就很简单了。 我们的 i 变量先在局部变量表中进行自增,然后再将 i 进栈,然后再把栈中的数据返回给我们的变量 i 。

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

此文章来源于:

blog.csdn.net/qq_44377709…
昨天刚好写了关于这个方面的,然后看到了这个文章所以分享给大家!

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改