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

来源:互联网 发布:网络搞笑红人排行榜 编辑:程序博客网 时间:2024/04/29 13:15

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

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  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++;可以换成如下写法:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. temp = j;  
  2. j = j++;  
  3. temp = j;  
所以结果是 0 。(此为书中解释)

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

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  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”。运算最终使用的,并不是变量本身,而是被赋了值的临时变量。

上述程序计算方法:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  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不同
0 0