公告

我隨便寫寫 你隨便看看

2011年2月10日 星期四

[筆記] 有趣的C語言試題

2011 2/10 2011開春第一篇...

int x=15,y=23;
問:經x^=y^=x^=y計算後其 x,y 的值

一開始,因為 x^=y 的意思是 x = x ^ y ,「^」 是XOR運算
所以我將程式由右至左拆解成如下的方式運算

x^=y : x=24 y=23
y^=x : x=24 y=15
x^=y : x=23 y=15

所以一開始看到這個題目我說答案為: x=23 y=15

之後,因手邊沒有C所以我用了一個跟C很接近的JAVA語言來實際驗證

x^=y^=x^=y : x=0 y=15

得到的答案為:x=0 y=15 與我算出的答案不一樣,所以我便深入研究了一下下。
進而發現了一個C語言的一個規則,也可以說是這題的一個陷阱。

C語言中 「^」的運算子優先權大於「=」
所以 x^=y^=x^=y 應該是要拆成下面的式子才合理

tmp1=y^(x^y) : tmp1=15
tmp2=x^(y^(x^y)) : tmp2=0

因為「^」要先算,「=」後算,所以我先把運算結果放在暫存的變數以方便觀察,又因為多個運算子運算要由右至左算,所以加上括弧比較容易理解些。

y=tmp1 : y=15
x=tmp2 : x=0

最後做「=」運算子的部分

拆解後的程式與原程式答案一樣,故這樣的推論應該是正確的。
以上是小弟的一點淺見,若有錯歡迎大家指正以免誤人子弟。謝謝。

2011/02/10 內容錯誤更正:
上述的文章內容有錯,我不應該將二元運算子「^=」視為兩個運算子。
這個連結有很清楚的解釋:《語法》表示式運算次序的迷思
為避免連結失效,全文備份至:《語法》表示式運算次序的迷思