我爱学Java之中间缓存变量机制
2016-05-02 21:00
344 查看
有一段代码如下:
上述结果为0。解释如下:
还有一段表达式:
结果等于7,原因是“中间缓存变量的机制”是对单个表达式计算来说。这道题可分解为:
由上述分解可以很清楚的明白,对于自增运算++j与j++,由于加一的执行顺序不同,所以Java中有中间缓存变量来储存其单个表达式的值,而j的自增自减的结果依然保留在原来的变量储存区。因为本体是j的值,而单个表达式的值是中间产生的一个临时变量值,是在整条计算表达式结束后就可以抛弃的值,所以用个临时中间缓存变量在放就可以了。这就可以实现自增自减运算在计算时值的加减1顺序差异产生的表达式与本体值差异的两个变量储存!
想想这种机制也应该是Java设计者的一个慎重的考虑。作为程序设计者,在出现j=f(j)的表达式的时候,一定是要求f(j)整个表达式的最终值,而不是在过程中j被各种自增自减后的值(如果要这样,那f(*)就没意义,还不如直接保留j的各种自增自减而抛掉其他加减乘除的表达式),所以f(j)的值不能被j的各种增减覆盖,于是有个缓存区来保留表达式中设计者的原意。不过作为程序设计者,这种情况还是尽量少出现为妙,越简单直观的程序势必是越高质量的、越是高容错的!
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;
还有一段表达式:
j =++j + j++ +j++ + j++
结果等于7,原因是“中间缓存变量的机制”是对单个表达式计算来说。这道题可分解为:
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的各种增减覆盖,于是有个缓存区来保留表达式中设计者的原意。不过作为程序设计者,这种情况还是尽量少出现为妙,越简单直观的程序势必是越高质量的、越是高容错的!
相关文章推荐
- struts2入门2--参数的传递
- DES加密解密->java实现
- java语言特性概述
- Spring入门之IOC与DI个人总结
- Struts2入门
- Eclipse下,LogCat(deprecated),显示不了内容,或者全部都是Unknown
- Java 反射基础(上)
- Java正则表达式的获取功能
- Spring入门之依赖注入(DI)
- 20160502-struts2入门--国际化
- Mavne + Spring整合CXF
- Java IO流分析整理
- Java中的String字符串为什么不可变
- Spring和CXF整合时报Unsupported major.minor version 51.0异常
- eclipse中Ctrl+Shift+F 无法格式化代码
- eclipse使用技巧及常用快捷键
- Cookie详解与应用(java,js)
- java.net.NoRouteToHostException: No route to host
- eclipse恢复已删除的文件
- java的常用的dos命令