终于弄明白 i = i++和 i = ++i 了_i=i++-程序员宅基地

技术标签: Java基础  

写在前面:前些天看完了JVM的内存结构,自以为自己是懂了,心里想想不就是分线程共享和线程私有嘛,然后又怎么怎么分怎么怎么的嘛…


直到遇到了这道题目。说句实话,曾经自己做这种运算题目,完全是靠脑子空想,然后拿上笔颤抖的写下一个自己都不知道正不正确的答案。不过过了今天,我终于能确定它的答案了。


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




1、题目

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内存结构。其中一个方法对应一个栈帧

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7S1O4RTM-1591687148745)(01_自增变量.assets/image-20200607101447244.png)]

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


2.1、第一步

int i = 1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2xGca3Uz-1591687148747)(01_自增变量.assets/image-20200607103756406.png)]

只是一个简单的赋值操作


2.2、第二步

i = i++

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bLH5OxNN-1591687148749)(01_自增变量.assets/image-20200607104123111.png)]

结果:i还是等于1


2.3、第三步

int j = i++

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H6LTb9Ge-1591687148751)(01_自增变量.assets/image-20200607104936003.png)]

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


2.4、第四步

int k = i + ++i * i++

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EOsOaSzt-1591687148753)(01_自增变量.assets/image-20200607110626891.png)]

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


2.5、结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6eruEoFm-1591687148754)(01_自增变量.assets/image-20200607110650949.png)]




3、i = ++i

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

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


最后的最后:当我和室友讨论一番之后,发现C语言的计算机制和Java的有些许出入,所以本文的思考过程和计算推导仅针对Java语言

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44377709/article/details/106643703

智能推荐

清屏函数 mysql,dos下数据库清屏-程序员宅基地

文章浏览阅读361次。Java基础常见的dos命令:盘: :进入指定的盘的根目录。dir :列出当前控制台所在的路径下的所有文件以及文件夹。cd 路径 :进入到指定的路径下。cd / :返回当前路径下的根目录。cd ....文章lambdaλ2017-09-16500浏览量lzg_ad:XPE的发布与部署步骤详解Win..._查看命令帮助,命令的词典,更复杂的还有 info,但不常用?

从创建web项目到利用echarts进行数据可视化_怎么在ecplise中web项目中展示饼图-程序员宅基地

文章浏览阅读880次。1,创建dynamic web project2,在连接好Tomcat之后,在eclipse中新建一个dynamic web project填好项目名称之后选择finish即可。然后在Servers下右键选择add and remove,随后选择已创建的项目,点击add将其添加到Tomcat中。在Window中选择show view,右键选择project explorer。打开后在project explorer下找到刚刚创建的项目,单击鼠标..._怎么在ecplise中web项目中展示饼图

Python3入门机器学习经典算法与应用 第3章 Jupyter Notebook基本用法 学习笔记_sjupyter第3章(教材)fileedit(日自动保存)widgetslogout| pytho-程序员宅基地

文章浏览阅读332次。for _ in range(10): print("hello")_sjupyter第3章(教材)fileedit(日自动保存)widgetslogout| python 3 0in l451:

中信银行软件开发中心 c语言笔试题目,中信银行软件研发中心笔试内容-程序员宅基地

文章浏览阅读1.6k次。2021中信银行软件研发中心春招即将开始,想必大家肯定想知道研发中心的笔试内容是什么,以及研发中心的笔试跟普通柜员岗有什么区别。下面,小编给大家进行一下关于中信银行软件研发中心以及信息科技岗的科普,有需要的同学们可以来看看啦!中信银行软件研发中心招聘条件想要进入银行的研发中心,其实也并没有那么容易。中信银行软件研发中心主要从事银行应用软件的开发、系统测试、应用维护、网络建设等工作,也就是大家常说的..._中信银行 软开中心笔试考试内容一样吗

头条面试题前端,Android Studio无法导入android,Android面试真题精选-程序员宅基地

文章浏览阅读529次,点赞16次,收藏11次。插入import android.support.v4.app.Fragment;Fragment显示红色那是因为较新版的安卓默认使用androidx的包,摒弃了以前的support包如果开启了自动导包,使用ViewPager + fragment的时候会自动导入androidx的包。

qt 提高代码质量_use multi-arg instead-程序员宅基地

文章浏览阅读6.5k次,点赞14次,收藏24次。① Use multi-arg instead【不要使用一连串的 arg().arg().arg() 了】QString("%1 %2").arg(a).arg(b); // BadQString("%1 %2").arg(a, b); // one less temporary heap allocation② parameter 'list' is passed by valu..._use multi-arg instead

随便推点

五阶科赫大雪花_五阶颗粒雪花-程序员宅基地

文章浏览阅读147次。五阶科赫大雪花画这个时间是真的长!!!_五阶颗粒雪花

【Linux】grep&sed替换字符串脚本实现_echo替换字符串-程序员宅基地

文章浏览阅读482次。实现脚本当前目录下的字符替换,同时打印出替换的文件内容。_echo替换字符串

mysql cluster 7.3_MySQL Cluster 7.3.5安装配置-程序员宅基地

文章浏览阅读62次。MySQL-Cluster简介:MySQL Cluster是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的集群。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求,适合于分布式计算环境的高实用、高冗余版本。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。MySQL Cluster将标准的MySQL服务器与名为NDB的“内存中”集群式存储引擎集成了起来。其中术语“M..._mysql cluster让用户可以在解决方案中

随心,随意,随笔...-程序员宅基地

文章浏览阅读81次。这几天 天天 都很忙的样子..我最近有点太忙了,然后脾气有点急躁..我妈很了解我,经常打电话劝我..然后最近貌似还是忍不住发脾气,这样不好不好.其实别看我平常很散漫,很随意的样子,我有时候确实有点太急躁了,事情多了自己都有些烦…首先,值得庆祝的事,微软实践项目总算提交了,胜利的走出了第一步,谢天谢地..谢谢我们Aglty团队的共同努力(heh,已经开始把这个团队名称给搬...

轻松使用zstd来解压缩_c++使用zstd算法解压缩文件-程序员宅基地

文章浏览阅读1.9w次,点赞2次,收藏22次。1. 工具介绍主要介绍 zstd 工具的作用和性能测试我们称Zstandard或Zstd是一种快速的无损压缩算法,是针对zlib级别的实时压缩方案,以及更好的压缩比。它由一个非常快的熵阶段,由Huff0和FSE库提供。这个项目是作为开源的BSD许可收费的库,以及一个生成和解码.zst格式。性能测试对比Compressor name Ratio Compression Decompress. zstd 1.4.4 -1 2.884 ..._c++使用zstd算法解压缩文件

结构体作为函数参数(值传递,引用传递,指针传递)_结构体作为函数参数(值传递,引用传递,指针传递)-程序员宅基地

文章浏览阅读1.7w次,点赞8次,收藏40次。一、值传递#include <iostream>#include <string>using namespace std;struct Student{ int id; string name; float score[2];};void OutCome(Student s){ cout<<s.id<&l..._结构体作为函数参数(值传递,引用传递,指针传递)