看板 C_and_CPP 關於我們 聯絡資訊
昨天看到一個題目 int x=15; y=23; x^=y^=x^=y; 請問x,y的值是多少? 我用編譯器去執行 結果搞不懂結果怎麼來的 我以為是轉成二進位 再做位元處理 可是也不是這樣 好 我就把它簡化成 x^=y; 結果x=24 y=23 但我還是不知道怎麼來的 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.125.226.169
VictorTom:x^=y 即 x = x ^ y, ^是xor的意思, 所以請把x與y兩數的 10/24 14:14
VictorTom:二進位值寫下, 然後照著運算式自己拿紙筆寫出一個直式運 10/24 14:14
VictorTom:算一算, 就知道它的結果是什麼了:) 10/24 14:15
VictorTom:話說, 您寫的結果好像不對吧?_? 10/24 14:16
LinuxC:喔喔 @@ 因為只憑記憶去打這篇 所以可能記錯了 10/24 14:17
nowar100:我猜答案會是 23 15 10/24 14:17
nowar100:這讓我想到以前的題目: 如何只用一行指令交換兩個整數 10/24 14:19
VictorTom:在某處先寫好SWAP的marco, 然後一行 SWAP(x, y); //XD 10/24 14:20
villix:樓樓上~一行怎麼寫啊XD 10/24 15:42
LinuxC:該不會是一行裡面有兩三個; 或是用函數? 這犯規吧 10/24 16:01
hilorrk:這個就是一行的integer swap不是嗎? 10/24 16:47
hilorrk:還是我記憶有誤...那就別理我了XD... 10/24 16:51
ibmibmibm:我覺得這違反第八誡,修改兩次以上了,應該是undefinded 10/24 17:24
yauhh:可是怪的是,它defined 10/24 17:26
zerodevil:不怪啊 一直都是undefined. http://0rz.tw/epRl5 10/24 18:04
yauhh:不是,所說行為未定義和行為有定義,是很明確的. 並不是說 10/24 18:24
yauhh:一個變數改二次就叫做行為未定義. 像這一行x^=y^=x^=y 行為 10/24 18:24
yauhh:明明在語法上就看得很清楚. 10/24 18:25
james732:x^=y^=x^=y; => (x^=(y^=(x^=y))); 好像沒有第二種解釋? 10/24 18:28
yauhh:它是個右結合的東西,從左邊先做,結果也不會改變.應該是某個 10/24 18:28
yauhh:編譯器做錯了. 10/24 18:29
zerodevil:yauhh去把上面的連結看完再來討論好嗎... 10/24 18:30
zerodevil:不是expression怎麼拆的問題 10/24 18:30
zerodevil:compiler有可能先evaluate左邊的x 並拿到修改前的值 10/24 18:31
zerodevil:造成x^=(y^=(x^=y)) = (舊的x)^=(新的y) = 0 10/24 18:33
zerodevil:c++ standard允許你這樣算. 10/24 18:33
james732:原來如此,還真沒想過這種型式的未定義行為... 10/24 18:37
xatier:a = a+b; b = a-b; a = a-b; 這玩意跟它好像 10/25 18:14