弄懂Java的自增变量

首先我们来看一段代码:

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 = 0a1b2c3

在进行运行时,左边的i是保存在局部变量中,也就是保存在栈中;而右边的计算是在操作数栈中进行计算的。

在进行右边操作数栈计算完毕后,会将结果赋值给左边对应的局部变量。

第一步

在进行 i = i ++ 进行计算时,会将左边的放进局部变量,右边的 i++ 放进操作数栈,然后进行计算。

此时计算 i++i++ 操作等于 i = i + 1 ,所以加 1 后赋值给局部变量,而操作数栈仍未 1

将操作数栈的 1 赋值给局部变量,所以这一步计算完之后结果仍未 1

第二步

​ 此时局部变量中i的值为 1 ,现将i放进操作数栈,然后计算 i++

计算完 i++ 之后,局部变量中的 i2 ,操作数栈的结果为 1

然后将操作数栈中的值赋值给 j

第三步

在进行计算之前, i 的值为 2j 的值为 1

右边的三个数字分别要压入操作数栈,分别是 i++ii++

i 直接放入是 2++i 要进行计算,计算后局部变量中的 i3 ,因为是 ++i ,所以放入的也是 3i++ 先放入 3 ,然后计算 i++ ,此时局部变量表中 i 的值为 4

将前一步操作数栈的值计算完之后放入 k 中即可。

总结

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