java自增策略小陷阱

首先,來一段小程序,我們先猜猜運行結果是怎樣?

/**
 * Created by Song on 2016/8/29.
 * 自增長測試
 */
public class Main {
    public static void main (String [] args){
        int num = 0;
        for (int i =0; i<10;i++){
            num = num++;
            System.out.println("num "+i+" :"+num);
        }
        System.out.println("最後值:"+num);
    }
}

我覺得,很大一部分的結果可能是,最終結果num=10. 因爲我們一直被教導num++是指先運算後執行自增操作。然而結果是這樣嗎?真實結果事實上是 num=0!!
這就涉及到不同語言對自增操作的具體實現方式了,在JVM下,num++的實現方式是這樣的,首先將num的值複製到臨時變量區,然後對原num值做加操作,最後返回臨時變量區的num值。我們可以將num++看成是一個函數(方法)體,其執行過程等同於以下代碼邏輯:

    int autoIncrement(int num){
        int temp = num;
        num = num+1;
        return  temp;
    }

現在可以理解了吧,對於語句 num = num++; 其右邊部分可以看成一個上面的函數體,儘管在執行過程中num值確實發生了改變,但右邊整體的返回值仍爲執行加操作之前的值,所以不管循環多少次,num都是初始值0!!
如果吧num=num++;改成num=++num又是什麼情況呢?有了這一次的經驗,我們應該能推算到++num 的實現過程是這樣的:

    int autoIncrement(int num){
        num = num+1;
        return  num;
    }

所以答案是10!!

發佈了40 篇原創文章 · 獲贊 90 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章