弄懂Java的自增变量
首先我们来看一段代码:
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);
}
大家可以先不要看下面的答案,写出自己的答案。
分析
在进行讲解前,我们先讲解一些基本的概念来帮助我们下面的分析。
概念
首先我们要知道普通我们的语句是如何执行的。
比如i = a + b * c
,我们设i = 0
, a
为1
,b
为2
,c
为3
。
在进行运行时,左边的i是保存在局部变量中,也就是保存在栈中;而右边的计算是在操作数栈中进行计算的。
在进行右边操作数栈计算完毕后,会将结果赋值给左边对应的局部变量。
第一步
在进行i = i ++
进行计算时,会将左边的放进局部变量,右边的i++
放进操作数栈,然后进行计算。
此时计算i++
,i++
操作等于 i = i + 1
,所以加1
后赋值给局部变量,而操作数栈仍未1
。
将操作数栈的1
赋值给局部变量,所以这一步计算完之后结果仍未1
。
第二步
此时局部变量中i的值为1
,现将i放进操作数栈,然后计算i++
。
计算完i++
之后,局部变量中的i
为2
,操作数栈的结果为1
。
然后将操作数栈中的值赋值给j
。
第三步
在进行计算之前,i
的值为2
,j
的值为1
。
右边的三个数字分别要压入操作数栈,分别是i
,++i
,i++
。
i
直接放入是2
;++i
要进行计算,计算后局部变量中的i
是3
,因为是++i
,所以放入的也是3
;i++
先放入3
,然后计算i++
,此时局部变量表中i
的值为4
。
将前一步操作数栈的值计算完之后放入k
中即可。
总结
- 赋值=,最后计算
- =右边的从左到右加载值依次压入操作数栈
- 实际先算哪个,看运算符优先级
- 自增、自减操作都是直接修改变量的值,不经过操作数栈
- 最后的赋值之前,临时结果也是存储在操作数栈中
弄懂Java的自增变量的更多相关文章
- 【转】彻底弄懂Java中的equals()方法以及与"=="的区别
彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
- 一文彻底搞懂Java中的环境变量
一文搞懂Java环境变量 记得刚接触Java,第一件事就是配环境变量,作为一个初学者,只知道环境变量怎样配,在加上各种IDE使我们能方便的开发,而忽略了其本质的东西,只知其然不知其所以然,随着不断的深 ...
- 一篇文章弄懂 Java 反射的使用
说到Java反射,必须先把 Java 的字节码搞明白了,也就是 Class , 大 Class 在之前的文章中,我们知道了Java的大Class就是类的字节码,就是一个普通的类,里面保存的是类的信息, ...
- 弄懂Java为何只有值传递
最近有同学问我关于Java中值传递与引用传递的问题,在此小结一下 值传递是指在函数调用时将实参内容复制一份传递给形参,这样在函数中改变该参数不会对原参数产生影响. 引用传递是指将对象地址的引用传递给该 ...
- 一文弄懂-《Scalable IO In Java》
目录 一. <Scalable IO In Java> 是什么? 二. IO架构的演变历程 1. Classic Service Designs 经典服务模型 2. Event-drive ...
- [转]js模块化编程之彻底弄懂CommonJS和AMD/CMD!
原文: https://www.cnblogs.com/chenguangliang/p/5856701.html ------------------------------------------ ...
- python中self与__init__怎么解释能让小白弄懂?
python中self与__init__怎么解释能让小白弄懂? 这个问题其实没那么简单. 只说一下自己的理解. python 里所有的 object 都有三个属性, 标识(identity), 类型( ...
- 一篇文章彻底弄懂Android-MVVM
转: 一篇文章彻底弄懂Android-MVVM 在学习一个技术之前,我们首先要搞清为什么要用它.用它以后会有什么好处,这样我们才能有兴趣的学习下去. 一.为什么要用MVVM? 我为什么要用这个什么MV ...
- 一文带你看懂Java中的Lock锁底层AQS到底是如何实现的
前言 相信大家对Java中的Lock锁应该不会陌生,比如ReentrantLock,锁主要是用来解决解决多线程运行访问共享资源时的线程安全问题.那你是不是很好奇,这些Lock锁api是如何实现的呢?本 ...
随机推荐
- Vue+Vuex 实现自动登录功能
刚刚实现了Vue+Vuex的自动登录功能,在实现的时候遇到了一些问题,这里记录一下: 因为这个还不够完善,在写完下列代码后,又进行了补充,可以从https://www.cnblogs.com/xiao ...
- yum命令无效
无论执行任何yum命令都无效,弄了两个小时.主要的方案有: 方案1:yum clean all 并查询repo中是否有enabled=0: https://unix.stackexchange.com ...
- java web基础
WEB基础 C/S:即服务器-客服机(Client-Server)结构.C/S结构通常采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互任务.客户通过局域网与服务器相连,接受用户的请求,并 ...
- Postgres基础操作
显示数据库\l \l+ dw=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ...
- poj3694 连通无向图图加边后有多少桥
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10261 Accepted: 3807 Descript ...
- zqt_helper 轻松开发Qt5 Widgets应用
目标: 1. 代码更加紧凑,所写即所到. 2. 代码层次更直观,直接反映界面窗口层次关系. 3. 不继承类,不重写虚函数,slot接收QEvent. 4. 简单写布局,忘掉api函数. 5. 免去一大 ...
- 开箱即用,Knative 给您极致的容器 Serverless 体验
作者 | 冬岛 阿里巴巴技术专家 导读:托管 Knative 开箱即用,您不需要为这些常驻实例付出任何成本.结合 SLB 云产品提供 Gateway 的能力以及基于突发性能型实例的保留规格功能,极大 ...
- Linux文件列表查询ll和ls区别
ll ll查询文件列表,查询结果为当前目录下文件和文件夹的详细信息,包括权限.根目录.用户.创建时间等. ls ls查询出的查询结果只显示当前目录下文件夹和文件名称
- 2/3/4G网络架构
1通讯网络演进 1.1 概念名词 LTE=Long Term Evolution=长期演进, 是3GPP制定的高数据率.低时延.面向分组域优化的新一代宽带移动通信标准项目. E-UTRAN 无线接入网 ...
- 赛艇表演 51nod提高组模拟试题
AC通道 题目描述 小明去某个地区观看赛艇比赛,这个地区共有n个城市和m条道路,每个城市都有赛艇比赛,在第i个 城市观看赛艇表演的价钱为ai, 去其他城市观看也需要支付赛艇表演的价格.任意两个城市之间 ...