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”的意图,而不是因为它本身是正确的或清晰的。该表达式的结果是未定义的;如果有很多编译器猜测出了意图结果,那么就有很多人在用懒散的程序逃避惩罚。
正如别人可能已经指出的那样,编译器和交换变量a和b在上述程序中一样,它可以自由地覆盖你的硬盘。
就为了好玩,我将看看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