Java中的自增操作符與中間緩存變量機制 – JAVA編程語言程序開發技術文章

我們來看這樣一段程序:
[java]
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);    

它的運行結果是:
[java]
sum1=1 
sum2=3 

而我用c語言編寫相同邏輯的代碼得到的卻是不同的結果:
[cpp] 
void main()   

    int i,sum1,sum2; 
 
    i=0; 
    sum1=(i++)+(i++); 
    printf("sum1=%d\n",sum1); 
 
    i=0; 
    sum2=(++i)+(++i); 
    printf("sum2=%d\n",sum2); 
 
    getchar(); 

它的運行結果是:
[cpp] 
sum1=0 
sum2=4 

這種不同是因為在c語言中,每個變量在它的生命周期內的每個時間點都隻能有一個唯一的值。因此變量在每一次自增運算時,變量所對應內存區域的內容就被重寫瞭。
而在java中,執行sum1=(i++)+(i++);創建瞭2個臨時的整型變量對象,對來存儲每次自增運算的結果。
java采用瞭這種中間緩存變量的機制。
再看程序員面試寶典中一個很經典的例子:
[java] 
public static void main(String[] args){  
        int j = 0;  
        for(int i = 0; i < 100; i++)  
            j = j++;  
        System.out.println(j);  
    }  
對java來說,j的輸出值是0。
因為java的中間緩存變量機制使j=j++語句看以分解成如下操作:
[java] 
temp = j;  
j = j + 1;  
j = temp;  
個人覺得這樣使用自增並不好,應該在復雜語句中避免使用後置的自增(自減)。
另外,值得註意的是某些采用瞭中間緩存變量機制的語言,輸出並不一定是0。比如C++在對一些基本類型以及指針類型進行後置自增操作時,編譯器將省去中間緩存變量的操作。

發佈留言