这个交换功能有什么问题

what is wrong with this swap function

我正在查看未定义交换函数的快速排序程序,然后我尝试 自己定义。

#include <stdio.h>
#include <stdint.h>

void swap(int *x, int *y)
{
         int tmp;
#if 1
        *x = *x ^ *y;
        *y = *y ^ *x;
        *x = *x ^ *y;
#endif

#if 0
        tmp = *x;
        *x  = *y;
        *y  = tmp; 
#endif

}

int partiotion(int a[], int low, int high)
{
        int i=low;
        int pivot_key = a[low];
        int j=high;

    do 
    {
        do { i++;} while (a[i] <= pivot_key);
        do { j--;} while (a[j] > pivot_key);

        if (i<j) swap(&a[i], &a[j]);
    } while (i<j);

    swap(&a[low], &a[j]);
    return j; 
}

void quick(int a[], int low, int high)
{
    int j;  

    if (low<high)
    {
        j = partiotion(a, low, high);
        quick(a, low, j);
        quick(a, j+1, high);
    }
}

int main()
{
    int a[] = {1,3,9,8,7, INT32_MAX}, i;

    quick(a, 0, 5);
    
    for(i=0; i < 5; i++)
        printf("%d\n", a[i]);
}

但是程序的输出结果是:

./a.out

0

0

0

0

9

如果我使用 tmp 变量(用于交换)它就可以正常工作,但是指针版本的交换有什么问题?

当您偶然调用 swap(&a[i], &a[i])(具有相同的索引)时会出现问题。两个指针都指向同一个数组项。在第一个 XOR 之后,项目变为 0,无论它之前是什么。