Java中的自增操作符与中间缓存变量机制

来源:互联网 发布:linux系统命令 编辑:程序博客网 时间:2024/05/21 13:14

先来看一道很经典 的例题吧


求下列代码的输出:

public class MyTest{    public static void main(String[] args){    int j = 0;for(int i = 0; i < 100; i++){    j = j++;}System.out.println(j);}}

输出为0. 不信? 读者可以自己去试试, 结果肯定是0. 书中给出的解释是: Java使用了中间缓存变量机制, 所以j = j++ 等价于 temp = j; j = j+1; j = temp;


我的火把呢?我要烧了这本书啊! 就这么简单的说等价于xxx就没了, 你至少解释下什么叫中间缓存变量机制吧. 不过, 至少书还告诉了我们关键词, 是时候展现真正的搜索技巧了!(笑)


Java在涉及自增运算符的运算中, 会采用中间缓存变量机制: 使用一个自增表达式的值的时候,会创建一个临时变量来保存这个自增表达式的值, 使用完这个自增表达式的值之后, 这个被创建的临时变量就会被销毁. 

先看下面的两个等价

//后置自增的等价num = j++;等价于temp = j;  //创建临时变量temp, 因为我们要使用的j++的表达式的值就是j的值, 故temp保存的自然是jj = j+1;  num = temp;//这里使用了自增表达式 j++的值(保存在temp的没有自加的j值), num = temp = j;//前置自增的等价num = ++j;等价于j = j + 1;  //因为对于自增表达式++j, 我们要使用的值就是j+1, 故会先进行自加temp = j;   //同样会创建临时变量temp, 并将我们要使用的值(自加后的j)赋给临时变量num = temp; //使用自增表达式 ++j的值(同样是保存在temp中的, 但是是自加后的j值)


有点晕? 先结合图示看看Java是怎么处理  num = i ++ 这一句的.


现在看看, 如果是 i = i ++ 会发生什么事情.


这就是一开始的例子中, 循环了99次之火, j 的输出依然为 0 的原因.


接着再看个例子巩固一下理解:

public static void main(String[] args){     int i, sum1, sum2;          i=0;     sum1 = (i++)+(i++);     System.out.println("sum1="+sum1);          i = 0;     sum2 = (++i)+(++i);     System.out.println("sum2="+sum2); }

输出为:


解析: 

对sum1 = (i++) + (i++) 我们用到了两个自增表达式的值, 前面说了, 由于中间缓存变量机制, Java会创建两个临时变量来保存这两个自增表达式要使用的值, 因此 sum = (temp1) + (temp2), 对temp1而言, 使用的值自然是i = 0, 把 0 赋给temp1, 然后 i 自增为1. 对temp2而言, 使用的值也是i, 此时为1,把1赋给temp2,  然后i自增为2 , 结果就是sum1 =  0 + 1 = 1.

对sum2同样, sum2 = (temp1) + (temp2), 对temp1而言,  使用的值是i+1, 先对i自增为1, 后把自增后的i 赋给temp1, 对temp2而言, 使用的值也是i+1, 先对i自增为2, 再把自增后的i赋给temp2, 结果就是 sum2 = 1 + 2 = 3.











0 0
原创粉丝点击