之前同事提到一個問題,
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)。
以這樣的觀點,來看++運算子,似乎就什麼都說得通了。