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.
- Java中的自增操作符与中间缓存变量机制
- Java中的自增操作符与中间缓存变量机制
- Java中的自增操作符与中间缓存变量机制
- Java中的自增操作符与中间缓存变量机制
- 关于java的自增操作符与中间缓存变量机制
- Java的中间缓存变量机制与自增操作符
- 关于自增运算符和java的中间缓存变量机制
- Java中间变量缓存机制
- Java中间缓存变量机制
- Java中间变量缓存机制
- java中间缓存变量机制
- Java中间缓存变量机制
- Java中间变量缓存机制
- java 中间缓存变量机制
- Java中间缓存变量机制
- Java中间变量缓存机制
- java中间缓存变量机制
- 【java学习笔记】java中的中间缓存变量机制
- Cocos2d-x 创建精灵的五种方法
- 腾讯微博分享的时候,无法进行授权。
- django学习(1)编写技巧
- hdoj 1257 最少拦截系统【贪心】
- adaptiveThreshold函数
- Java中的自增操作符与中间缓存变量机制
- 153Sum
- Oracle学习笔记20150823java程操作数据库与部分常见函数的使用
- 双链表分析
- Android UI设计——RadioButton和CheckBox控件
- SkCanvas旋转矩阵SkMatrix
- C源码@数据结构与算法->BinomialQueue
- PHP位运算符
- POJ1265----Area