《Java程序员面试宝典》5.2——中间缓存变量机制

转载自:http://blog.csdn.net/waycaiqi/article/details/43486249


看到第三版中5.2的例题4,一开始只是简单地接受中间缓存变量的机制,例题如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public   class   Test {   
  2.     public   static   void   main(String[]   args)   {   
  3.       int   j   =   0;   
  4.       for   (int   i   =   0;   i   <   100;   i++)   {   
  5.         j   =   j++;   
  6.       }   
  7.       System.out.println(j);   
  8.     }   
  9.   }   
  上述结果为0。解释如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 1. temp=j;  
  2. 2. j=j+1;  
  3. 3. j=temp;  

      看到例题5里的题:int j = 0; j =++j + j++ +j++ + j++;结果等于7,就纳闷了,这里怎么不是“中间缓存变量的机制”最后j=0?

      看了一些解释都说得不是很清楚。思考了下,发现原来“中间缓存变量的机制”是对单个表达式计算来说。如,题目5可分解为:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 1. j = j+1;            // (++j)的自增  
  2. 2. temp1 = j =1;       // (++j)表达式的结果的中间缓存变量  
  3. 3. temp2 =  j =1;      //(j++)表达式的结果的中间缓存变量  
  4. 4. j = j+1=2;          // (j++)的自增  
  5. 5. temp3 =  j =2;      //(j++)表达式的结果的中间缓存变量  
  6. 6. j = j+1=3;          // (j++)的自增  
  7. 7. temp4 =  j =3;      //(j++)表达式的结果的中间缓存变量  
  8. 8. j = j+1=4;          // (j++)的自增  
  9. 9. j = temp1 + temp2 + temp3 + temp4 = 1+1+2+3=7;  

 

  由上述分解可以很清楚的明白,对于自增运算++j与j++,由于加一的执行顺序不同,所以Java中有中间缓存变量来储存其单个表达式的值,而j的自增自减的结果依然保留在原来的变量储存区。因为本体是j的值,而单个表达式的值是中间产生的一个临时变量值,是在整条计算表达式结束后就可以抛弃的值,所以用个临时中间缓存变量在放就可以了。这就可以实现自增自减运算在计算时值的加减1顺序差异产生的表达式与本体值差异的两个变量储存!

      想想这种机制也应该是Java设计者的一个慎重的考虑。作为程序设计者,在出现j=f(j)的表达式的时候,一定是要求f(j)整个表达式的最终值,而不是在过程中j被各种自增自减后的值(如果要这样,那f(*)就没意义,还不如直接保留j的各种自增自减而抛掉其他加减乘除的表达式),所以f(j)的值不能被j的各种增减覆盖,于是有个缓存区来保留表达式中设计者的原意。不过作为程序设计者,这种情况还是尽量少出现为妙,越简单直观的程序势必是越高质量的、越是高容错的!

      有些面试题目虽然不是很高深,但是却还是需要细细琢磨,死记硬背是不会得到真正的提升的,加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值