如果两个数字都指向同一位置,则不使用额外空间而交换两个数字?

Kra*_*mar 0 c c++

最近我遇到这个问题写一个函数交换两个数字而不使用额外的空间?该功能可以有两种方式:

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都指向单个内存位置,它们将无法工作?如何解决这个问题?

mas*_*oud 5

这个问题在数学上很明显.

int swap ( int *a, int* b)
{
    *a = *a+*b;
    *b = *a-*b;
    *a = *a-*b;
}
Run Code Online (Sandbox Code Playgroud)

ab指向同一位置,然后,上述代码变成

*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版本也一样.