弄懂Java的自增变量
2010 年 10 月 27 日
首先我们来看一段代码:
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
中即可。
总结
- 赋值=,最后计算
- =右边的从左到右加载值依次压入操作数栈
- 实际先算哪个,看运算符优先级
- 自增、自减操作都是直接修改变量的值,不经过操作数栈
- 最后的赋值之前,临时结果也是存储在操作数栈中