推 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
→ 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