i = i++

之前同事提到一個問題,

int i = 1;

i = i++;

以C#執行所得到的i 會是 1,為什麼?

之前同事提到一個問題,

 int i = 1;

i = i++;

以C#執行所得到的i 會是 1,為什麼?

是編譯器的問題嗎?

當時,我的答案是當執行i = i ++的時候,i會先把原值,也就是1準備指派(=)給左邊的變數也就是i,然後i會先加1,然後又被指派的1這個值覆蓋回來,所以最後,i的值還是1。

後來,同事拿了C++、Java測試,結果i的值卻為2?

這是為什麼呢?

於是,我開了二個專案,來測試以上的結果,C#的專案i會為1,而C++的專案1會為2。

???問題在那裡呢?

怎麼會這樣?

我思考了幾種可能性,是不是因為C#的++不是真的++呢?

還是真的是編譯器有問題?

後來我看到了一個有趣的算式,i = i++ - ++i;

這個算式在C++中不管i的值為多少,最後都會為1,

而在C#中則會為-2,

這讓我不解了,是不是我不夠了解i++及++i的意義,為什麼出現的答案完全不在我的掌握之內。

接下來的時間,我做了一些數值的測試,並且用i = i++ + ++i;來測試,

我得到了一個結論,為什麼C++的會出現這樣的結果的原因是在於,

如果i的初值是1,當i = i++的時候會先將1指給左邊的i值,然後會將i + 1,會相當於做了i = i; i = i + 1;

當i = i++ - ++i的時候,在i++的時候,i會還是為原值,在++i的時候,i 會為2,然後會將2 - 2的值指派給左邊的i,

最後 i + 1,所以結果為1。

而在C#上,i = i++的結果會等效於tmp = i; i = i + 1; i = tmp;

當i = i++ - ++i則會i++的時候i會為2 return 1,++i的時候i會為3,然後,i = 1-3,所以結果為-2。

會造成這樣結果的原因,

在於C++及C#對於i++的定義並不同,

C++的定義是i++是將"i 變數"先回傳,再將i + 1,而C#的定義是將"i的值"回傳,再將i + 1。

如果是傳回i 變數的話,運算結果會根據所做的++來決定運算的結果,這也是為什麼C++的i = i++ - ++i;最後的i會為1的原因,

因為他會等效為i = i - i; i = i + 1;,而C#的話,則會暫存運算的結果,使其等效於 i = i - (i + 1 + 1)。

以這樣的觀點,來看++運算子,似乎就什麼都說得通了。