19

弄懂Java的自增变量

 4 years ago
source link: http://www.cnblogs.com/ArvinYL/p/13060884.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

首先我们来看一段代码:

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是保存在局部变量中,也就是保存在栈中;而右边的计算是在操作数栈中进行计算的。

MjaUne6.png!web

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

ZZRfm2e.png!web

第一步

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

FRFRjm7.png!web

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

BBZbAre.png!web

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

bme2UrJ.png!web

第二步

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

Q3q2I3q.png!web

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

I3QnEvV.png!web

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

IzAbU3a.png!web

第三步

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

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

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

VbeQfm7.png!web

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

rEzaau6.png!web

总结

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK