对于i++和++i主要是需要需要弄清楚局部变量表和操作数栈的作用,运算过程中数据是怎么保存的。
先可以简单理解为:
i++是先使用值在加1(先将局部变量表的数据写入到操作数栈后,再局部变量表加1)
++i是先加1再使用(先局部变量表加1,再将局部变量表的数据写入到操作数栈)
=是赋值操作,是运算的最后一步,是直接从操作数栈计算好值后,覆盖到局部变量表,就是我们最后的结果
下面举几个例子帮助理解:
例一
public static void main(String[] args) {
int i = 1;
i = i++;
int j = 1;
i = i++;
System.out.println("i=" + i);
System.out.println("j=" + j);
}
结果:
i=1
j=2
i=1解释
int i = 1; 将1放入局部变量表。此时栈=null,变量表=1,
i = i++;;++在后面,先将局部变量表的数据写入到操作数栈后,再局部变量表加1。此时栈=1,变量表=2,然后赋值(=)操作,将栈覆盖到变量表,此时栈=1,变量表=1,结果是1
j=2解释
int j = 1;将1放入局部变量表。此时变量表=1,栈=null
i = i++;++在后面,先局部变量表加1,再将局部变量表的数据写入到操作数栈。此时栈=2,变量表=2,然后赋值(=)操作,将栈覆盖到变量表,此时栈=2,变量表=2,结果是2
例二
public static void main(String[] args) {
int i = 2;
int m = i++ * ++i;
int j = 2;
int n = ++j * j++;
System.out.println("m=" + m);
System.out.println("n=" + n);
}
结果
m=8
n=9
m=8解释
int i = 2; 将2放入局部变量表。此时栈=null,变量表=2
int m = i++ * ++i; 这个运算因为有一个运算符乘(*)号,所以包括2个部分
- i++先将局部变量表的数据写入到操作数栈后,再局部变量表加1。此时栈=2,变量表=3
- ++i先局部变量表加1,再将局部变量表的数据写入到操作数栈。 此时栈=2&4,变量表=4
赋值(=)操作,将栈覆盖到变量表,此时栈=8(2*4),变量表m=8,i=4,结果是8
n=9解释
int j = 2;将2放入局部变量表。此时栈=null,变量表=2
int n = ++j * j++;这个运算因为有一个运算符乘(*)号,所以包括2个部分
- ++j先局部变量表加1,再将局部变量表的数据写入到操作数栈。 此时栈=3,变量表=3
- j++先将局部变量表的数据写入到操作数栈后,再局部变量表加1。此时栈=3&3,变量表=4
赋值(=)操作,将栈覆盖到变量表,此时栈=9(3*3),变量表n=9,j=4,结果是9
总结
局部变量表的数据从哪里来?
数据初始化,int=1
赋值语句,从操作数栈覆盖,i=
操作数栈的值从哪里来?
从局部变量表获取
赋值(=)操作的值从哪里来
运算后的数据会写入到局部变量表,最终的值就是局部变量表的值