Java中间缓存变量机制(i++)

本文深入探讨了Java自增运算的机制,通过具体示例解释了i++和++i的区别,以及如何理解自增运算的过程。重点分析了自增运算中临时变量的作用,帮助读者更好地理解Java内存管理及运算细节。

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

Java程序员面试宝典(第二版)中有这样一道笔试题:

  1. /**下列程序的输出结果是()*/  
  2. import java.util.*;  
  3. public class Test{  
  4.     public static void main(String[] args){  
  5.         int j = 0;  
  6.         for(int i=0;i<100;i++){  
  7.             j = j++;  
  8.         }  
  9.         System.out.println(j);  
  10.     }  
  11. }  
正确结果:程序的运行结果是 0

结果很像是 100,为什么是 0?

因为Java用了中间缓存变量机制,所以j=j++;可以换成如下写法:

  1. temp = j;  
  2. j = j++;  
  3. temp = j;  
所以结果是 0 。(此为书中解释)

至此貌似是明白了!那么再来一题:

  1. /**下来代码执行的结果*/  
  2. import java.util.*;  
  3. public class Test2{  
  4.     public static void main(String args[]){  
  5.         int i = 0;  
  6.         i = i++ + ++i;  
  7.           
  8.         int j = 0;  
  9.         j = ++j + j++ + j++ + j++;  
  10.           
  11.         int k = 0;  
  12.         k = k++ + k++ + K++ + ++k;  
  13.           
  14.         int h = 0;  
  15.         h = ++h + ++h;  
  16.           
  17.         System.out.println("i="+i);  
  18.         System.out.println("j="+j);  
  19.         System.out.println("k="+k);  
  20.         System.out.println("h="+h);  
  21.     }  
  22. }  

i=2

j=7

k=7

h=3

看到结果貌似不是真的明白Java的 i++和++i !

问题实质:在java中,执行自增运算时,会为每一个自增操作分配一个临时变量,如果是前缀加(++i),就会“先自加1后赋值(给临时变量)”;如果是后缀加(i++),就会“先赋值(给临时变量)后自加1”。运算最终使用的,并不是变量本身,而是被赋了值的临时变量。

上述程序计算方法:

  1. int i = 0;  
  2. i = i++ + ++i; //i=2,等效执行以下程序    
  3.  /*    
  4.   * temp1 = i;        //i=0,temp1=0  
  5.   * i = i + 1;        //i=1    
  6.   * i = i + 1;        //i=2    
  7.   * temp2 = i;        //i=2,temp2=2   
  8.   * a = temp1 + temp2 //i=2;    
  9.   */      
  10.  int j = 0;    
  11.  j = ++j + j++ + j++ + j++;  //j=7      
  12.  /*    
  13.   * j = j + 1;        //j=1    
  14.   * temp1 = j;        //j=1 , temp1=1  
  15.  
  16.   * temp2 = j;        //j=1, temp2=1  
  17.   * j = j + 1;        //j=2  
  18.    
  19.   * temp3 = j;         //j=2,temp3=2 
  20.   * j = j + 1;        //j=3 
  21.    
  22.   *temp4 = j;         //j=3 ,temp4=3 
  23.   *j = j + 1;         //j=4 
  24.    
  25.   * j = temp1 + temp2 + temp3 + temp4 //j=7;    
  26.   */      
  27.    
  28.  int k = 0;    
  29.  k = k++ + k++ + K++ + ++k; //k=22      
  30.  /*    
  31.   * temp1 = k;        //k=0, temp1=0  
  32.   * k = k + 1;        //k=1  
  33.    
  34.   * temp2 = k;         //k=1,temp2=1 
  35.   * k = k + 1;        //k=2 
  36.    
  37.   *temp3 = k;         //k=2 ,temp3=2 
  38.   *k = k + 1;         //k=3 
  39.  
  40.   * k = k + 1;        //k=4    
  41.   * temp4 = k;        //k=4 , temp4=4  
  42.    
  43.   * k = temp1 + temp2 + temp3 + temp4 //k=7;     
  44.   */      
  45.      
  46.  int h = 0;  
  47.  h = ++h + ++h; //h=3      
  48.  /*    
  49.   * h = h + 1;        //h=1    
  50.   * temp1 = h;        //k=1 , temp1=1  
  51.    
  52.   * h = h + 1;        //h=2    
  53.   * temp2 = h;        //h=2, temp2=2  
  54.   * h = temp1 + temp2 //h=3;    
  55.   */   

需要注意的是: C语言中的计算方法和Java不同
java缓存实现demo完整实例,很不错的资源,欢迎大家来下载学习。/** * 此函数接受一个对象列表,数目不定,opration:表是触发的事件 * eg:change;fnClear:表示初始化下拉框。var_args表示多个下拉框... */ function bindSelects(operation, initSelectObj, loadShow, var_args){ //每个argument对象都有一个 change事件 //change事件会触发:此argument之后的对象清空,紧跟此对象的后一对象发送ajax请求 var elementList = []; for (var i = 3; arguments[i]; i++) { elementList[i-3] = arguments[i]; } for (var i = 0; elementList[i]; i++) { (function(k) { elementList[k].bind(operation, function(){ selectType = elementList[k].attr("name"); //其后的对象进行某个操作 for (var j = k+1; elementList[j]; j++) { if (initSelectObj && initSelectObj.constructor===Function) { if(elementList[k].val() == "") { initSelectObj(elementList[j],elementList[j].data(SELECT_KEY)); LOAD_KEYS[j].hide(); } else{ initSelectObj(elementList[j],elementList[j].data(SELECT_KEY)); } } } //紧跟对象发送ajax if (elementList[k+1]) { if(elementList[k].val() != "") { //从页面缓存中取出 if(elementList[k+1].data(elementList[k].val())) { var data = elementList[k+1].data(elementList[k].val()); var key=LIST_KEYS[k]; var jsonKey = [key]; addContentToSelect(data,jsonKey,elementList[k+1]); } else { //从缓存中取出数据 if (fnAjax && fnAjax.constructor===Function) { loadShow(LOAD_KEYS[k+1]); fnAjax(elementList[k+1].data(SELECT_KEY),LIST_KEYS[k],LOAD_KEYS[k+1],elementList[k],selectType); } } } } }); })(i); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值