《Java程序员面试宝典》5.2.3

7次阅读

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

public class Test {     public static void main(String[] args) {       int j = 0;       for (int i = 0; i < 100; i++) {         j = j++;       }       System.out.println(j);     }   } 上述结果为0。解释如下:1. temp=j;2. j=j+1;3. j=temp;

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

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

1. j = j+1;// (++j)的自增2. temp1 = j =1;// (++j)表达式的结果的中间缓存变量3. temp2 = j =1;//(j++)表达式的结果的中间缓存变量4. j = j+1=2;// (j++)的自增5. temp3 = j =2;//(j++)表达式的结果的中间缓存变量6. j = j+1=3;// (j++)的自增7. temp4 = j =3;//(j++)表达式的结果的中间缓存变量8. j = j+1=4;// (j++)的自增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的各种增减覆盖,于是有个缓存区来保留表达式中设计者的原意。不过作为程序设计者,这种情况还是尽量少出现为妙,越简单直观的程序势必是越高质量的、越是高容错的!

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

有的旅行时为了寻找逝去的年华,重温青春的惆怅。

正文完   
相关文章:
随机文章
亚马逊无理由退货政策解析及自发货退货处理方法

亚马逊无理由退货政策解析及自发货退货处理方法

亚马逊无理由退货政策解析及自发货退货处理方法 作为全球最大的在线商家之一,亚马逊向买家提供了优质的产品和贴心的...
速卖通营销活动的取消是否会产生影响?

速卖通营销活动的取消是否会产生影响?

随着全球经济的发展,电子商务行业在近年来得到了迅速的增长。尤其是在中国市场中,电子商务行业已经成为了一个高速增...
出口水果销售渠道选择,这些常见误区需警惕

出口水果销售渠道选择,这些常见误区需警惕

出口水果销售渠道选择,这些常见误区需警惕 在出口水果的销售过程中,选择合适的销售渠道是非常重要的。不同的销售渠...
速卖通产品违规规则概述!了解常见的违规类别和规则!

速卖通产品违规规则概述!了解常见的违规类别和规则!

速卖通作为全球领先的跨境电商平台,备受海外卖家的青睐。然而,为了维护平台的正常秩序,加强产品质量控制,速卖通也...
了解eBay发布的“闽品出海计划”

了解eBay发布的“闽品出海计划”

eBay作为全球知名的电商平台,一直致力于帮助中国和海外卖家打开市场,拓展业务。近期,eBay发布了“闽品出海...