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

最新文章

  1. Qt字符编码,创建中文文件
  2. UGUI 下拉滚动框
  3. 2021年中国现制茶饮行业洞察报告
  4. 前端笔记之ES678WebpackBabel(上)初识ES678Babellet和const解构语法
  5. iOS MJRefresh下拉刷新(上拉加载)使用详解
  6. easyui-validatebox验证 radio
  7. sunplus8202V双无线游戏手柄设计
  8. LR11中web_save_timestamp_param
  9. STL源代码剖析——STL算法stl_algo.h
  10. 【下载】跨越鸿沟:颠覆性产品营销圣经-杰弗里·摩尔电子书下载(pdf,epub,mobi,txt)
  11. java CANUSB_周立功USBCAN-II 上位机开发(MFC)
  12. 数字图像处理_07.2_(顶帽变换,击中击不中原理)
  13. 【渝粤教育】电大中专中药学基础 (2)作业 题库
  14. 概率论与数理统计 基本概念
  15. python数据分析岗位_python拉勾数据职位分析
  16. 如何从Linux下载一个文件到本地
  17. 民宿逐渐兴起后 旅游会不会是90后创业新方向?
  18. 《队长说得队》第三次作业:团队项目的原型设计
  19. EDA 电子设计自动化VHDL系列课程7 – 分频器和计数器
  20. 计算机组成原理——总线控制(总线判优控制、总线通信控制)

热门文章

  1. 最简单的git merge 和git rebase 介绍和示例演示
  2. Jenkins 在Windows下插件无法安装问题解决
  3. maven 入门介绍
  4. elasticsearch6 php,elasticsearch 6.x php-client
  5. 如何做相册_今天才知道,原来长按微信相册,还隐藏着一个实用功能
  6. 计算机三级之嵌入式系统学习笔记8
  7. 【编程帮助】python中字符串前的 r、b、u、f 的含义及用法
  8. oracle安装选取字符集,oracle10g字符集问题及设置PL/SQL、sqlplus字符集
  9. Java LinkedHashMap 逆序遍历
  10. HTML 内容不能被选择,不能被复制