此公式交换两个数字而不使用临时变量,但使用算术运算:
a = (a+b) - (b=a);
如果没有算术运算,我怎么能这样做?我在想XOR。
答案 0 :(得分:20)
a=a+b;
b=a-b;
a=a-b;
这很简单但有效....
答案 1 :(得分:19)
在C中这应该有效:
a = a^b;
b = a^b;
a = a^b;
或者看起来更冷静/更喜欢:
a^=b;
b^=a;
a^=b;
有关详细信息,请查看this。 XOR是一个非常强大的操作,有许多有趣的用法在这里和那里出现。
答案 2 :(得分:17)
为什么不使用std libs?
std::swap(a,b);
答案 3 :(得分:15)
在不使用任何临时存储或算术运算的情况下交换两个数字的最佳方法是将两个变量加载到寄存器中,然后以相反的方式使用寄存器!
你不能直接从C那样做,但是编译器可能很有能力为你解决(至少,如果启用了优化) - 如果你编写简单明了的代码,比如KennyTM建议的代码在他的评论中。
e.g。
void swap_tmp(unsigned int *p)
{
unsigned int tmp;
tmp = p[0];
p[0] = p[1];
p[1] = tmp;
}
使用带有-O2
优化标志的gcc 4.3.2编译:
swap_tmp:
pushl %ebp ; (prologue)
movl %esp, %ebp ; (prologue)
movl 8(%ebp), %eax ; EAX = p
movl (%eax), %ecx ; ECX = p[0]
movl 4(%eax), %edx ; EDX = p[1]
movl %ecx, 4(%eax) ; p[1] = ECX
movl %edx, (%eax) ; p[0] = EDX
popl %ebp ; (epilogue)
ret ; (epilogue)
答案 4 :(得分:6)
我之前没有见过这个C解决方案,但我确信有人已经想过它。也许比我更有发布自我控制权。
fprintf(fopen("temp.txt", "w"), "%d", a);
a = b;
fscanf(fopen("temp.txt", "r"), "%d", &b);
没有额外的变数!
它适用于我,但根据stdio实现,您可能需要对输出缓冲做一些事情。
答案 5 :(得分:4)
使用XOR,
void swap(int &a, int &b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
XOR的一个班轮,
void swap(int &a, int &b)
{
a ^= b ^= a ^= b;
}
这些方法似乎是干净的,因为它们不会因任何测试用例而失败,但是因为(如方法2中)变量的值在相同的序列点内被修改了两次,它被认为是具有ANSI C声明的未定义行为。
答案 6 :(得分:3)
a =((a = a + b) - (b = a - b));
答案 7 :(得分:1)
C++11
允许:
std::swap(a, b);
std::swap_ranges(a.begin(), a.end(), b.begin());
std::tie(b, a) = std::make_tuple(a, b);
std::tie(c, b, a) = std::make_tuple(a, b, c);
答案 8 :(得分:0)
除了以上解决方案之外,如果其中一个值超出有符号整数的范围,则可以用这种方式交换这两个变量值
a = a+b;
b=b-(-a);
a=b-a;
b=-(b);
答案 9 :(得分:-1)
也可以使用乘法和除法。
int x = 10, y = 5;
// Code to swap 'x' and 'y'
x = x * y; // x now becomes 50
y = x / y; // y becomes 10
x = x / y; // x becomes 5
答案 10 :(得分:-1)
答案 11 :(得分:-2)
只需使用其他内容,例如一个不是临时的变量。例如,
int main (int argc, char** argv) {
int a = 5; int b = 6;
argc = a; a = b; b = argc;
}
毕竟,问题的关键不在于表现出明智的做法(c=a;a=b;b=c
)。这是为了表明你可以开箱即用,或者至少复制其他人的答案。