C:通过加法交换不能正常工作但通过引用交换可以吗?

C: swapping by addition not working correctly but swapping by reference is?

我试图在 C 中实现快速排序算法,但是当我尝试使用以下代码片段(我打算这样做)交换元素 xy 时,我不断收到这个奇怪的错误如果我能够解决此问题,请在我的代码中用作宏):

x = x + y; // step 1
y = x - y; // step 2
x = x - y; // step 3
#include <stdio.h>
#include <stdlib.h>
int partition (int *A, int p, int r) 
{
    int i, j, pivot;
    pivot = A[r];
    i = (p - 1);
    for (j = p; j < r; j++) {
        if (A[j] <= pivot) {
            i++;       
            printf ("Before: A[i] = %d, A[j] = %d\n", A[i], A[j]);
            A[i] = A[i] + A[j];
            printf ("A[i] = %d ", A[i]);
            A[j] = A[i] - A[j];
            printf ("A[j] = %d ", A[j]);
            A[i] = A[i] - A[j]; 
            printf ("A[i] = %d\n", A[i]);
            printf ("Finally: A[i] = %d, A[j] = %d\n\n", A[i], A[j]);
        }
    }
    putchar ('\n');
    printf ("Before: A[i + 1] = %d, A[r] = %d\n", A[i + 1], A[r]);
    A[i + 1] = A[i + 1] + A[r];
    printf ("A[i + 1] = %d ", A[i + 1]);
    A[r] = A[i + 1] - A[r];
    printf ("A[r] = %d ", A[r]);
    A[i + 1] = A[i + 1] - A[r];
    printf ("A[i + 1] = %d\n", A[i + 1]);
    printf ("Finally: A[i + 1] = %d, A[r] = %d\n\n", A[i + 1], A[r]);
    return (i + 1);
}

int my_qsort (int *A, int p, int r) 
{
    int q;
    if (p < r && A != NULL) {
        q = partition (A, p, r); 
        my_qsort (A, p, q - 1);  
        my_qsort (A, q + 1, r);  
        return 1;               
    } 
    return 0;
}

int display (int *arr, int len) 
{
    int i;
    if (len == 0) {
        printf ("Array is empty.\n");
        return 0;
    }
    for (i = 0; i < len; i++) {
        printf ("%d ", arr[i]);
    }
    putchar ('\n');
    return 1;
}

int main (int argc, char **argv) 
{
    int i, len = argc - 1;
    int arr[len];
    for (i = 0; i < len; i++) {
        arr[i] = atoi (argv[i + 1]);
    }
    puts ("Before quick sort:");
    display (arr, len);
    my_qsort (arr, 0, len-1);
    puts ("After quick sort:");
    display (arr, len);
    return 0;
}

如果这太长了,我深表歉意。我尝试将交换问题隔离为一个最小的工作示例,但它工作正常并且没有出现错误。还有 丑陋的印刷声明是必要的,以说明什么是错误的。这是我 运行 程序的部分输出:

./prg 9 8 7 6 5 4 3 2 1 | less

如您所见,对于 A[i] = 8A[j] = 8,第 1 步给出 16(正确),但随后 第 2 步和第 3 步产生 0 ??考虑到交换工作,这真的很奇怪 第一次交换正确(标有勾号)。如标题中所述,我尝试使用其他交换方法(例如使用临时变量)并通过 通过传递指针使用函数 swap() - 它们都有效。这是唯一的 这不起作用的实例。我可能会遗漏一些非常简单的东西,那真的很尴尬。有什么想法吗?

如果 i + 1 等于 ri 等于 j 那么你将有

printf ("Before: A[i + 1] = %d, A[r] = %d\n", A[i + 1], A[r]);

// Before: A{i + 1] = 8, A[r] = 8

A[i + 1] = A[i + 1] + A[r];
// A[i + 1] = 16, A[r] = 16

printf ("A[i + 1] = %d ", A[i + 1])
// A[i + 1] = 16

A[r] = A[i + 1] - A[r];
// A[r] = A[i + 1] = 0

printf ("A[r] = %d ", A[r]);
// A[r] = 0

A[i + 1] = A[i + 1] - A[r];
// A[i + 1] = A[r] = 0

printf ("A[i + 1] = %d\n", A[i + 1]);
// A[i + 1] = 0

printf ("Finally: A[i + 1] = %d, A[r] = %d\n\n", A[i + 1], A[r]);
// Finally: A[i + 1] = 0, A[r] = 0

那是使用您的交换方法,您不能将对象与其自身交换。