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

本文详细解析Java自增运算符在处理时的中间缓存变量机制,通过具体代码实例,解释了后置自增与前置自增的等价变换过程,并分析了这些机制对循环中变量输出的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


求下列代码的输出:

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保存的自然是j
j = 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.











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值