[筆記] 有趣的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 內容錯誤更正:
上述的文章內容有錯,我不應該將二元運算子「^=」視為兩個運算子。
這個連結有很清楚的解釋:《語法》表示式運算次序的迷思
為避免連結失效,全文備份至:《語法》表示式運算次序的迷思