不使用 3rd(临时变量)进行交换在这个程序中给出了不同的答案,有人能告诉我为什么吗?

swapping without using 3rd(temporary variable) is giving diff answer in this program can someone tell me why?

当交换部分在第三个变量(临时变量)的帮助下完成时它工作正常但是当它在不使用临时变量的情况下完成时(如 a=a+b; b=a-b; a=a-b;)输出变化

这个quick_sort程序工作正常,但当交换方法改变时输出会改变

#include<stdio.h>
void swap(int *a,int *b){/*
*a=*a+*b;
  *b=*a-*b;
  *a=*a-*b;*/
 int t=*a;
  *a=*b;
  *b=t;
}
int sort(int a[],int st,int piv){
int i=st-1,j,t;
for(j=st;j<=piv-1;j++){
if(a[j]<=a[piv]){
        i++;
   swap(&a[j],&a[i]);

  
}}
swap(&a[i+1],&a[piv]);
return i+1;

}
void quick(int a[],int st,int en){
if(st<en){
    int x=sort(a,st,en);
    quick(a,st,x-1);
    quick(a,x+1,st);
}
}
void main(){
int a[]={11,1,23,22,10,18,0,13},i;
quick(a,0,7);
for(i=0;i<8;i++)
printf("%d ",a[i]);

}

让我们看看您的替代版本的 swap!

void swap(int *a,int *b){
    *a=*a+*b;
    *b=*a-*b;
    *a=*a-*b;
}

假设a=x,b=y,那么我们得到:a=x+y,接着是b=x+y-y=xa=x+y-x=y。这些可以证明您的交换代码是有意义的。但是问题在哪里呢?你的推理意味着 int* a 独立于 int* b。如果您尝试调用 swap(&a[0],&a[0]) 而您的预期行为是 a[0] 保持不变,则不会发生这种情况,因为 ab 指向完全相同的内存位置。

这是它的正确版本:

void swap(int *a,int *b){
  if(a==b) return;
  *a=*a+*b;
  *b=*a-*b;
  *a=*a-*b;
}

编辑:虽然此方法适用于大多数情况,但可能会因 a+b 溢出而失败。不要在实际代码中使用它,但可以保留它以便理解 if(a==b) return;.

的原因