自增变量操作:
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=4,j=1,k=11
解析:
1、int i=1
,局部变量表中有一个 i=1 的变量
2、i = i++
,i++中 i 要运算,先把i的值压入操作数栈
3、i变量自增 1,不经过操作数栈,在局部变量表中i的值变为 2
3、最后进行赋值,把操作数中的值赋给 i,i的值又变为了 i。
所以说,i 的值好像只是很短暂的自增了一下。
4、int j = i++
中,和上面的套路一样,i 的值自增变为了2。赋值操作使 j 变为1
5、int k = i + ++i * i++
中,从左到右加载值依次压入操作数栈。先把 i 压入操作数栈,i的值为2。
6、然后计算++i
,i变量自增1变为3,再把i的值压入操作数栈。此时操作数栈有3和2
7、再计算i++
,先把 i 的值压入操作数栈,再把i变量自增1变为4。此时操作数栈有3、3和2。
8、看运算符优先级。先把操作数栈中前两个弹出求乘积,3*3=9,将结果再压入栈。此时栈有9和2。
9、把操作数栈中的值弹出求和再赋值给 k,k值为11。
小结
- 赋值 = ,最后计算
- = 右边的从左到右加载值依次压入操作数栈
- 实际先算哪个,看运算符优先级
- 自增、自减都是直接修改变量的值,不经过操作数栈
- 最后的赋值之前,临时结果也是存储在操作数栈中
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。