看板 b96902HW 關於我們 聯絡資訊
: -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 140.112.30.54 : ※ 編輯: chhsiao 來自: 140.112.30.54 (09/29 00:31) : ※ 編輯: chhsiao 來自: 140.112.30.54 (09/29 00:39) : 推 imprazaguy:題外話,^有一個應用,就是可以做變數值交換的動作 09/29 00:37 : → imprazaguy:#define swap(a,b) ((a)^=(b)^=(a)^=(b)) 09/29 00:39 這是從 IOI 97 的解答學到的招數 其實一點都不神奇,只要把 truth table 畫出來看一看就知道了。 不過其實這樣寫,除了唬人以外,大部份的時候都沒比較好。 這樣寫 跟 {int t; t = a; a = b; b = t;} 比起來, 反而用的運算還比較多,所以效率其實比較差。 而且在 i386 的機器上有內建 exchange instruction, 如果 compiler 的最佳化做得夠好, 後者的型式有可能直接以一個 instruction 取代, 不過 XOR 交換法嘛.... 我相信沒幾個 compiler 會偵測出來 XD 這個寫法唯一的好處是,當要交換的 datatype 不固定時,不用去管 datatype。 不過可以做 ^ 運算,而 int 存不下的,也只有 long long int 了, 所以......意義還是不大 XD BTW, 這個寫法是 P 老師的 good programming style 裡 "標準" 的反例 XD -- n;main(i){return n?i<2?i:main(i-1)+main(i-2): scanf("%d",&n)&&printf("%d\n",n>0?main(n):0);} -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.54 ※ 編輯: chhsiao 來自: 140.112.30.54 (09/29 00:54)
purincess:ACP的投影片還有介紹呢 09/29 00:55
imprazaguy:我同意你的看法。 09/29 01:00
imprazaguy:不過因為我有的時候懶的把它寫成函式(還要用指標), 09/29 01:02
imprazaguy:所以就採取這種比較簡便的方式,雖然不好。 09/29 01:04
chhsiao:#define swap(a,b) {int _;_=(a);(a)=(b);(b)=_;} 09/29 01:04
chhsiao:對了 上面這樣寫要注意"傳進去"的變數不能叫 _ XD 09/29 01:10
※ 編輯: chhsiao 來自: 140.112.30.54 (09/29 01:19)