Java中間緩存變量機制(i++)

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不同
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章