最近我遇到这个问题写一个函数交换两个数字而不使用额外的空间?该功能可以有两种方式:
int swap ( int *a, int* b)
{
*a = *a+*b;
*b = *a-*b;
*a = *a-*b;
}
Run Code Online (Sandbox Code Playgroud)
另一种方式是XOR操作:
int swap ( int *a, int* b)
{
*a = *a^*b;
*b = *a^*b;
*a = *a^*b;
}
Run Code Online (Sandbox Code Playgroud)
即使这两个函数都是一个好主意,如果a和b都指向单个内存位置,它们将无法工作?如何解决这个问题?
这个问题在数学上很明显.
int swap ( int *a, int* b)
{
*a = *a+*b;
*b = *a-*b;
*a = *a-*b;
}
Run Code Online (Sandbox Code Playgroud)
当a并b指向同一位置,然后,上述代码变成
*a = *a + *a; // *a = 2 x (*a)
*b = *a - *a; // = 0
*a = *a - *a; // = 0
Run Code Online (Sandbox Code Playgroud)
所以,这两个*a和*b是零.因此你应该用if:
int swap ( int *a, int* b)
{
if (a!=b)
{
*a = *a+*b;
*b = *a-*b;
*a = *a-*b;
}
}
Run Code Online (Sandbox Code Playgroud)
对于xor版本也一样.