自增变量

    先来看看下面的代码:

  1. public class test {  
  2.     public static void main(String[] args) {  
  3.         int i = 1;  
  4.         i = i++;  
  5.         int j = i++;  
  6.         int k = i + ++i * i++;  
  7.         System.out.println(i);  
  8.         System.out.println(j);  
  9.         System.out.println(k);  
  10.     }  

先来分析第4行:

    这是经典题目i=i++;,可以扯出Java的特性

    首先先算等号右边,i++,然后由于i++是先用后加,当然看似先用后加,其实虚拟机是先把这个操作数做一个备份,然后再原数上加,赋值时候把这个备份赋值出去,所以我们执行如下操作:

  

  1. 把i值压入操作数栈,因为运算过程是要在操作数栈中进行

  2. i变量自增,局部变量表中的i变成2

  3. 我们刚刚算的是整个右边的结果2,然后把备份赋值出去

    因此i=i++;这句话结果是i没有自增。

接下来分析第5行:

    这时候还备份时,还给的是j所以i自增的值被保留下来了

 

接下来看第6行:

  1. 把i的值压入操作数栈
  2. 后面一个++i,i变量自增1,变成3
  3. 执行完后的得数都会被压入操作数栈【局部量表:3 操作数栈:3/2】
  4. i++ 把i的值压入操作数栈【局部量表:3 操作数栈:3/3/2】
  5. i变量自增 【局部量表:4 操作数栈:3/3/2】
  6. 把操作数栈中前两个弹出求乘积结果再压入栈【局部量表:4 操作数栈:9/2】
  7. 把操作数中的值弹出求和赋值求和给k【局部量表:4 操作数栈:空】

大家可以仿造我们初学栈时老师给的表达式求值的算法题,来模拟上述过程。

原文地址:https://www.cnblogs.com/figsprite/p/10775838.html