终于弄明白 i = i++和 i = ++i 了

news/2024/9/23 4:18:57/

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


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


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

文章目录

    • 1、题目
    • 2、分析
      • 2.1、第一步
      • 2.2、第二步
      • 2.3、第三步
      • 2.4、第四步
      • 2.5、结果
    • 3、i = ++i




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语言


http://www.ppmy.cn/news/445727.html

相关文章

iwrite复制粘贴

1&#xff0c;登录iwrite 登录iwrite 2&#xff0c;打开需要完成的作业 打开作业 3&#xff0c;按<F12>,再按<F1>,打开chrome控制台&#xff0c; 打开chrome控制台 找到Disable JavaScript前面的小方框并选中 关闭JavaScript 不要马上关闭控制台 4&#xff0c…

i++和++i的真正区别

文章目录 问题描述模拟的机制源码解析指令图解1.方法执行前在内存中的的数据结构2.执行iconst_03.执行istore_14.执行iload_15.执行iinc 1 by 16.执行istore_1 测试示例结论 问题描述 记得刚开始学编程的时候还是从c语言开始的&#xff0c;还是看的谭浩强写的那本书&#xff0c…

Option3X 5G 全网部署(基于 IUV_5G 软件)

目录 步骤一&#xff1a;组网选型 步骤二&#xff1a;拓扑规划 步骤三&#xff1a;链路预算 步骤四&#xff1a;站点选址 步骤五&#xff1a;设备配置 步骤一&#xff1a;组网选型 以兴城市为例选择非独立组网架构 步骤二&#xff1a;拓扑规划 一般的非独立组网网元架构…

I3C协议Single Data Rate(SDR)模式研读(一):总线配置Bus Configuration

官方I3C协议规范技术文档中文版 从本篇开始将介绍I3C Protocol&#xff0c;其中主要包括两种模式&#xff1a;SDR和HDR&#xff0c;详细见下图 1. Single Data Rate (SDR) Mode SDR模式是I3C总线的默认模式&#xff0c;主要用于从当前主设备到从设备的私人消息传递。 SDR模式…

i++ 和 ++i 详解

18、i 和 i 详解 1、参考链接&#xff1a;https://blog.csdn.net/song854601134/article/details/111291272?ops_request_misc%257B%2522request%255Fid%2522%253A%2522164698445016780274194665%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&reques…

Intel(R) Ethernet Connection I218 V及Intel(R) Ethernet Connection I219 V不能安装windows Server解决方法

该网卡在安装windows Server系列系统&#xff08;如windows server2012 、windows server2016、windows server2019等&#xff09;时无法安装驱动。 经过查询资料和对比驱动程序&#xff0c;Intel Ethernet Connection I218-LM有windows server驱动。 也兼容多种网卡所以也应该…

DOI号详解

何为DOI号&#xff1f; doi的全称是“digital object identifier”&#xff0c;数字对象唯一标识&#xff0c;被喻为“互联网上的条形码”、“科技论文的身份证”&#xff0c;通过它可以方便、可靠地链接到论文全文。doi代码具有唯一性&#xff0c;这种特性保证了在网络环境下…

I2C协议---I2C时序图解析

一、I2C协议简介 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由 Phiilps 公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c;不需要 USART、CAN 等通讯协议的外部收发设备&#xff0c;现在被广泛地 使用在系统内多个集成…