作者chhsiao (bye~)
看板b96902HW
标题Re: [问题] Dev C的问题
时间Sat Sep 29 00:51:20 2007
: --
:
※ 发信站: 批踢踢实业坊(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)
1F:→ purincess:ACP的投影片还有介绍呢 09/29 00:55
2F:推 imprazaguy:我同意你的看法。 09/29 01:00
3F:→ imprazaguy:不过因为我有的时候懒的把它写成函式(还要用指标), 09/29 01:02
4F:→ imprazaguy:所以就采取这种比较简便的方式,虽然不好。 09/29 01:04
5F:推 chhsiao:#define swap(a,b) {int _;_=(a);(a)=(b);(b)=_;} 09/29 01:04
6F:推 chhsiao:对了 上面这样写要注意"传进去"的变数不能叫 _ XD 09/29 01:10
※ 编辑: chhsiao 来自: 140.112.30.54 (09/29 01:19)