天天看點

且說自增自減的前後置

    自增自減的前後置?不就是,前置的先自增減後指派,後置的先指派後增減嗎,事實上并沒有那麼簡單.

    先來看看下面這一C++代碼段:

  1. int i = 0;
  2. i = i++ + ++i;

    此時i的值是多少呢?2?不,是3.再看看下面這一代碼段:

  1. int i = 0;
  2. i = i + ++i;

    此時i的值為1?對不起,答案是2.也許你會不屑的認為:沒人會這樣寫代碼,而且不同的編譯器的解釋也不同.

    我非常同意"沒人會這樣寫代碼"的論斷,但這不是本文所要考慮的.至于"不同的編譯器的解析也不同",我可以負責的說,我們常用的微軟的C++編譯器和GCC都是這樣解釋的.

    再看看Java對自增自減的前後置的解釋吧.

  1. int i = 0;
  2. i = i++ + ++i;

    如果你仍然堅持i為2的話,恭喜你,你是對的. 同樣地,對于下面的代碼段,執行後i的值是1.

  1. int i = 0;
  2. i = i + ++i;

    至此,我們看到了對前後置的兩種截然不同的解釋方法:

    一 C++一類的解釋.

    此類的解釋是前置的自增自減是在表達式的執行前執行的,而後置的自增自減是在表達式的執行後執行的.如何來了解呢?

    對于"i = i + ++i",C++的解釋相當于"++i,i = i + i";對于"i = i++ + ++i"C++的解釋相當于"++i,i = i + i, i++".這樣就可以很好的解釋了上面的結果.按照這一理論,執行下面這一代碼段後,i的值是4,經過驗證,結果确實如此.

  1. int i = 0;
  2. i = ++i + ++i;

    二 Java一類的解釋.

    此類的解釋,不像C++那樣以表達式為分界線來劃分前置和後置的執行時機,而是以引用來劃分.前置的自增自減是在這一次引用前執行的,後置的操作則是在這一次引用後,下一次引用前執行.

    對于"i = i + ++i",Java的解釋相當于"j = i, ++i, k = i, i = j + k";對于"i = i++ + ++i"的解釋是"j = i, i++, ++i, k = i, i = j + k".這一種解釋符合我們的正常了解.按照這一理論,下面代碼執行後, i的值是3.

  1. int i = 0;
  2. i = ++i + ++i;

    C++為什麼要如此解釋,這一問題值得思考.很明顯,C++如此解釋,編譯後運作性能絕對比Java編譯後運作得好.性能正是C++所追求的.C++這樣解釋雖然運作得快,但很容易出錯.而Java,這個記憶體管理基于引用的語言,為了保證程式的穩健,對前後置作出另一中合乎常理但運作得慢的解釋.C++的靈活與Java的穩健可見一斑.