【发布时间】:2012-09-15 12:39:06
【问题描述】:
昨天看到了下面这个函数。
static void swap (int *p, int *q) {
*p -= *q;
*q += *p;
*p = *q - *p;
}
在什么情况下这个功能不起作用?我认为可能存在溢出问题,而且效率也可能很低。还有什么吗?
【问题讨论】:
-
异或技巧可能吗?注意:p 和 q 可以指向同一个对象。
-
是的,这些正是问题所在,溢出和混叠。
-
谢谢,我没有考虑别名的情况。
-
这只是一个个人问题,我阅读了几个交换两个变量的解决方案,我以前从未见过这种方法。所以我问为什么。这不是家庭作业。 ;)
-
@EdHeal:此外,编译器通常能够使用临时变量检测交换,并将其转换为单个适当的汇编指令(如果可用)。