回到首頁
關於我
我的Picasa
留言板
訂閱我的文章
放大字型
原始字型
回到最上層

控制主頁

公告

感謝各位網友的造訪與回應,由於工作的關係實在沒有心力繼續維護這個BLOG。對於各位的留言,有時候真的感到心有餘而力不足,所以沒有回應的部分,還請眾網友們多多包涵。Hans在這邊感謝你們的參與~~ 2011.12.20 Hans

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

0 回應: