发件人:The Amorphous Mass <robinson@blue.weeg.uiowa.edu>
新闻组:comp.lang.c
主题:Rea ^= b ^= a ^= b ???
日期:1995年9月21日星期四15:04:13 -0500
Message-ID:<Pine.A32.3.91.950921145742.43918A-100000@black.weeg.uiowa.edu>
In-Reply-To:<43k3bf$ipk@winx03.informatik.uni-wuerzburg.de>

1995年9月18日,Frank Hofmann写道:
> 到目前为止,我觉得这个讨论串很有趣。所以我自己也试了一下
>
> void main (void)
> {
>   int a, b;
>   a = 123; b = 7654;
>   printf ("a = %d, b = %d\n", a, b);
>   a^=b^=a^=b;
>   printf ("a = %d, b = %d\n", a, b);
> }

这段代码让我的同事的东芝笔记本崩溃了,不是因为^=位运算,而是因为void main(void)。我们把它改成了int main(void),然后它就像你希望的那样工作了。

我们使用的是BC++ 4.5。

然而,它在你能找到的每一台编译器、每一个平台上都能工作的事实意义不大。它之所以能工作,是因为编译器足够“聪明”地正确猜测出了你对“a^=b^=a^=b”的意图,而不是因为它本身是正确的或清晰的。该表达式的结果是未定义的;如果有很多编译器猜测出了意图结果,那么就有很多人在用懒散的程序逃避惩罚。

正如别人可能已经指出的那样,编译器和交换变量ab在上述程序中一样,它可以自由地覆盖你的硬盘。

就为了好玩,我将看看THINK C 5.0会怎么处理它。

___________
Bushido, n.: the ancient art of keeping your  | James Robinson
cool when a US President ralphs in your lap.  | james-f-robinson@uiowa.edu