在不使用3rd(临时变量)的情况下进行交换会在该程序中给出差异答案,有人可以告诉我为什么吗?

食神者

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

这个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]);

}
克里斯托斯·哈吉佩特罗斯(Christos Hadjipetros)

让我们看一下交换的替代版本!

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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章