1. 程式人生 > >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);	 
}

它的執行結果是:

sum1=1
sum2=3

而我用c語言編寫相同邏輯的程式碼得到的卻是不同的結果:
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();
}

它的執行結果是:

sum1=0
sum2=4

這種不同是因為在c語言中,每個變數在它的生命週期內的每個時間點都只能有一個唯一的值。因此變數在每一次自增運算時,變數所對應記憶體區域的內容就被重寫了。

而在java中,執行sum1=(i++)+(i++);建立了2個臨時的整型變數物件,對來儲存每次自增運算的結果。

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++語句看以分解成如下操作:

temp = j; 
j = j + 1; 
j = temp; 

個人覺得這樣使用自增並不好,應該在複雜語句中避免使用後置的自增(自減)。

另外,值得注意的是某些採用了中間快取變數機制的語言,輸出並不一定是0。比如C++在對一些基本型別以及指標型別進行後置自增操作時,編譯器將省去中間快取變數的操作。