做者:MaggieDoramijava
咱們來看這樣一段程序:
程序員
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語言編寫相同邏輯的代碼獲得的倒是不一樣的結果:
面試
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採用了這種中間緩存變量的機制。
再看程序員面試寶典中一個很經典的例子:
緩存
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++在對一些基本類型以及指針類型進行後置自增操做時,編譯器將省去中間緩存變量的操做指針