自增变量问题(i++)

自增变量操作:

 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的值压入操作数栈

自增变量问题(i++)_第1张图片

3、i变量自增 1,不经过操作数栈,在局部变量表中i的值变为 2

自增变量问题(i++)_第2张图片

3、最后进行赋值,把操作数中的值赋给 i,i的值又变为了 i。

自增变量问题(i++)_第3张图片

所以说,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

自增变量问题(i++)_第4张图片

7、再计算i++,先把 i 的值压入操作数栈,再把i变量自增1变为4。此时操作数栈有3、3和2。

自增变量问题(i++)_第5张图片

8、看运算符优先级。先把操作数栈中前两个弹出求乘积,3*3=9,将结果再压入栈。此时栈有9和2。

9、把操作数栈中的值弹出求和再赋值给 k,k值为11。

小结

  • 赋值 = ,最后计算
  • = 右边的从左到右加载值依次压入操作数栈
  • 实际先算哪个,看运算符优先级
  • 自增、自减都是直接修改变量的值,不经过操作数栈
  • 最后的赋值之前,临时结果也是存储在操作数栈中

你可能感兴趣的:(java)