i++和++i的联系与区别!超详细原理分析!
1. i++和++i的基本概念
案例 1:
/**
* @author pcwl
* @description i++ 和 ++i 详解
*/
public class Test {
public static void main(String[] args) {
int i= 1;
int j = i++;
System.out.println("j = " + j);
System.out.println("i = " + i);
}
}
public class Test {
public static void main(String[] args) {
int i= 1;
int j = ++i;
System.out.println("j = " + j);
System.out.println("i = " + i);
}
}
int i = 1;
int j = i++; // 先将i的原始值(1)赋值给变量j(1),然后i变量的值加1
int j = ++i; // 先将i变量的值加1,然后将i的当前值(2)赋值给变量j(2)
2. i++ 和 ++i 的实现原理
/**
* @author pcwl
* @description i++ 和 ++i 详解
*/
public class Test {
public void testIPlus() {
int i = 0;
int j = i++;
}
public void testPlusI() {
int i = 0;
int j = ++i;
}
}
...
{
...
public void testIPlus();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=3, args_size=1
0: iconst_0 // 生成整数0
1: istore_1 // 将整数0赋值给1号存储单元(即变量i)
2: iload_1 // 将1号存储单元的值加载到数据栈(此时 i=0,栈顶值为0)
3: iinc 1, 1 // 1号存储单元的值+1(此时 i=1)
6: istore_2 // 将数据栈顶的值(0)取出来赋值给2号存储单元(即变量j,此时i=1,j=0)
7: return // 返回时:i=1,j=0
LineNumberTable:
line 4: 0
line 5: 2
line 6: 7
public void testPlusI();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=3, args_size=1
0: iconst_0 // 生成整数0
1: istore_1 // 将整数0赋值给1号存储单元(即变量i)
2: iinc 1, 1 // 1号存储单元的值+1(此时 i=1)
5: iload_1 // 将1号存储单元的值加载到数据栈(此时 i=1,栈顶值为1)
6: istore_2 // 将数据栈顶的值(1)取出来赋值给2号存储单元(即变量j,此时i=1,j=1)
7: return // 返回时:i=1,j=1
LineNumberTable:
line 9: 0
line 10: 2
line 11: 7
}
...
3. i++ 和 ++i 使用的一些坑
01
案例1:i=i++导致的结果异常
public class Test {
public static void main(String[] args) {
int i = 0;
i = i++;
System.out.println("i = " + i); // 0
}
}
正常来讲,执行的结果应该是:i = 1,实际结果却是:i = 0,这多少会让人有些诧异。为什么会出现这种情况呢?我们来从编码后的代码中找答案。上面的代码编译后的核心代码如下:
0: iconst_0 // 生成整数0
1: istore_1 // 将整数0赋值给1号存储单元(即变量i,i=0)
2: iload_1 // 将1号存储单元的值加载到数据栈(此时 i=0,栈顶值为0)
3: iinc 1, 1 // 1号存储单元的值+1(此时 i=1)
6: istore_1 // 将数据栈顶的值(0)取出来赋值给1号存储单元(即变量i,此时i=0)
7: getstatic #16 // 下面是打印到控制台指令
10: new #22
13: dup
14: ldc #24
16: invokespecial #26
19: iload_1
20: invokevirtual #29
23: invokevirtual #33
26: invokevirtual #37
29: return
temp = i;
i = i + 1;
i = temp;
所以 i 不变, 依然是0。
02
案例2
public class Test {
public static void main(String[] args) {
int i = 0;
i++;
System.out.println("i = " + i); // 1
}
}
0: iconst_0 // 生成整数0
1: istore_1 // 将整数0赋值给1号存储单元(即变量i,i=0)
2: iinc 1, 1 // 1号存储单元的值+1(此时 i=1)
5: getstatic #2
8: new #3
11: dup
12: invokespecial #4
15: ldc #5
17: invokevirtual #6
20: iload_1
21: invokevirtual #7
24: invokevirtual #8
27: invokevirtual #9
30: return
-------- END ---------
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。关注公众号并回复 888 领取,更多内容陆续奉上
i++和++i的联系与区别!超详细原理分析!相关推荐
- 支持向量机(SVM)----超详细原理分析讲解
文章目录 支持向量机(SVM) 直观的本质理解 几个基础概念 决策超平面的求解(SVM模型的推导) 最大硬间隔的寻找与公式构建 拉格朗日乘数法的应用 使用对偶问题求解 一个小例子(求解决策超平面与决策 ...
- mysql left/right join算法效率分析_mysql left join,right join,inner join超详细用法分析
MySQL left join,right join,inner join超详细用法分析 下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 ...
- JAVA使用HttpClient模拟登录正方教务系统,爬取学籍信息和课程表成绩等,超详细登录分析和代码注解
目录 前言 分析 代码实现 第一次GET POST登录 第二次Get 第三次GET 第四次GET 第五次GET 测试 完整代码 前言 最近在做一个APP,需要获取我们学校--武汉纺织大学皇家停水断电断 ...
- Kickstart无人值守安装系统(含DHCP超详细原理)
前言: 为啥要用无人值守安装系统?很简单的答案!就两个! 一个是方便日常工作,另一个就是可以用来装逼! 常规装系统的办法有哪些? 光盘安装系统===>一个服务器DVD内置光驱百千块,百台服务器都 ...
- yield和return的区别-- 超详细
首先比较下return 与 yield的区别: return:在程序函数中返回某个值,返回之后函数不在继续执行,彻底结束. yield: 带有yield的函数是一个迭代器,函数返回某个值时,会停留在某 ...
- 【路径规划】Dijkstra算法——超详细原理图解
Dijkstra算法详解 1. Dijkstra算法原理 1.1. 有向图的Dijkstra算法 1.2. 无向图和栅格网络的拓展 1.2.1. 无向图 1.2.2. 栅格网络 2. Di ...
- eMMC工作模式 - 超详细原理讲解
博主福利:100G+电子设计学习资源包! http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5 ...
- 『 高达 购物车案例 』jQuery + Java Script 全功能实现【超详细 代码分析】
- v-model获取值与.value取值的区别(v-model原理分析)
vue中使用v-model在表单元素上创建双向数据绑定,在官方文档中简单的提到了它的本质只是一个语法糖,在单向数据绑定的基础上,增加了监听用户输入事件并更新数据的功能: 对,它本质上只是一个语法糖,但 ...
最新文章
- LInux main.cpp 编码问题 导致影响后面的内容
- java httpclient访问webservice_java通过HttpClient方式和HttpURLConnection方式调用WebService接口...
- numpy的array合并-【老鱼学numpy】
- 艾伟:MOSS 2007 项目的开发步骤
- 如何使用 Istio 进行多集群部署管理(一)
- iOS开发 plist字段列表,很全
- python关于路径需使用的方法笔记
- locktty锁终端的方法
- 6代u笔记本完美支持win7_Z170等六代主板装WIN7后USB不能用实测超简单解决教程
- python的三种取整方式_python3.6 numpy 数组的多种取整方式
- Hackintool 3.4.7中文版 (黑苹果必备工具箱神器)
- Python通过selenium操作edge浏览器
- Justice 「未见系列 2」随夏而至,总有一款让你心动的配色!
- 百度分享不支持https的解决方案
- 总结整理Echarts双y轴曲线图(全)
- html5 3d自动,html5 3D微信头像自动抽奖代码
- Spring Boot DAY03 配置文件的注入
- Hung-Yi Lee homework[7]: Network Compression
- Idea插件开发之Gradle
- (全栈旅行足迹地图打卡网站 0-1)-旅行足迹文章记录(项目完结)-15(WebGIS Vue-js-go-mysql)