Thinking in ++i and i++
2019独角兽企业重金招聘Python工程师标准>>>
i++ 与++i是我们在操作临时变量经常用到的操作符,但是,不小心又会把自己搞的很糊涂。终其原因,还是没有搞清楚其本质 。
i++:书上所说,当++位于变量后时,表示为在该变量调用 后将其加1 即i = i+1;
++i:在调用i之间先将i加1 再进行应用 。
但是,这里有一个例子:
int i = 1;
i = i++;
System.out.println(i);
问:这时的i值是多少?
刚开始,有很多人会认为是2;他们给出的理由是,i在定义时便进行了初始化--->1;然后进行i = i++ 运算,此时的i还是1,但是随即进行i++操作,修改了原先的i值,即i的值为2,所以应该输出2。
其实不然,本人理解如下:
int i = 1; i = i++;这段代码与下面代码相同:
int i = 1;
int temp = i;
i ++;
i = temp;
JVM会给i分辟一块新的内存,在进行最后的赋值操作时又将这块新内存中的值给它。也就是说,i的值还是自己以前的值,没有变。通过javap -c 反编译便可看到具体信息:
从主方法内可以看到执行过程:
iconst_1:将常数1压栈,栈内容【1】;
istore_1:将栈顶元素弹出,也就是1(i),保存到局部变量区索引为1的地方,栈内容【】;
iloadt_1:将局部变量区索引为1的值压入栈,栈内容【1】
iinc 1,1:将局部变量变量区索引为1(i)的值加1,此时栈内容为【2】;
istore_1:将栈顶元素弹出,存入局部变量区索引为1的地方,此时i又变成了1,栈内容为【】
getstatic #2:获取常量池中索引为2所表示的类变量,也就是System.out,栈内容【】
iload_1:将局部变量区索引为1的值(也就是i)压入栈,栈内容【1】
invokevirtual #3:调用常量池中索引为3的方法---->System.out.println
return: 返回main方法
综上,i的值是没有变化 的,还是先前初始化赋给的值 ----->1;
那行,我们再改改,看下段代码执行结果是什么:
int i = 1;
int j = 0;
j = i++;
System.out.println(i); //这时,i的值 为2;为什么呢?
解释如下:
栈首先对i进行压栈,后弹出,放在局部变量区中(索引为1);然后对j进行压栈,再弹出存储在局部变量区(索引为2);
接着,栈将局部变量区中索引为1的值i进行压栈,将局部变量区索引为1的值进行加1操作--->i=2;
在对i进行加1操作后,再将栈顶元素弹出(记住,此时的栈顶元素i值 为1),保存到局部变量区索引为2的地方(即对j进行加1操作),j--->1;
调用System.out
将局部变量区中索引为1的值压入栈中,此时栈顶元素为2;
调用常量池中System.out.println方法
return;
所以,此时i的值变为了2 。
总结,i++与++i对于每 一个人来说,其逻辑是不难的。难点就在于对堆栈原理 理解的不够深。
转载于:https://my.oschina.net/u/938966/blog/106293
最新文章
- Qt字符编码,创建中文文件
- UGUI 下拉滚动框
- 2021年中国现制茶饮行业洞察报告
- 前端笔记之ES678WebpackBabel(上)初识ES678Babellet和const解构语法
- iOS MJRefresh下拉刷新(上拉加载)使用详解
- easyui-validatebox验证 radio
- sunplus8202V双无线游戏手柄设计
- LR11中web_save_timestamp_param
- STL源代码剖析——STL算法stl_algo.h
- 【下载】跨越鸿沟:颠覆性产品营销圣经-杰弗里·摩尔电子书下载(pdf,epub,mobi,txt)
- java CANUSB_周立功USBCAN-II 上位机开发(MFC)
- 数字图像处理_07.2_(顶帽变换,击中击不中原理)
- 【渝粤教育】电大中专中药学基础 (2)作业 题库
- 概率论与数理统计 基本概念
- python数据分析岗位_python拉勾数据职位分析
- 如何从Linux下载一个文件到本地
- 民宿逐渐兴起后 旅游会不会是90后创业新方向?
- 《队长说得队》第三次作业:团队项目的原型设计
- EDA 电子设计自动化VHDL系列课程7 – 分频器和计数器
- 计算机组成原理——总线控制(总线判优控制、总线通信控制)
热门文章
- 最简单的git merge 和git rebase 介绍和示例演示
- Jenkins 在Windows下插件无法安装问题解决
- maven 入门介绍
- elasticsearch6 php,elasticsearch 6.x php-client
- 如何做相册_今天才知道,原来长按微信相册,还隐藏着一个实用功能
- 计算机三级之嵌入式系统学习笔记8
- 【编程帮助】python中字符串前的 r、b、u、f 的含义及用法
- oracle安装选取字符集,oracle10g字符集问题及设置PL/SQL、sqlplus字符集
- Java LinkedHashMap 逆序遍历
- HTML 内容不能被选择,不能被复制