这是一个奇怪的错误,我得到一个简单的选择排序。
使用以下输入89,52,10,1,56,63,24,36,12,5
如果您要调试它,您会注意到在第3次迭代期间该行
a[i]=a[i] ^ a[min];
将两个操作数都设置为零。
任何想法为什么会这样?
#include<stdio.h>
int main()
{
int a[10]={'\0'};
int i=0,j=0,k=0;
int min=0;
printf("Enter 10 Elements\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<10;i++)
{
min=i;
for(j=i+1;j<10;j++)
{
if(a[j]<a[min])
{
min=j;
}
}
a[i]=a[i] ^ a[min];
a[min]= a[min] ^ a[i];
a[i]= a[i] ^ a[min];
}
for(i=0;i<10;i++)
{
printf("\n %d",a[i]);
}
return(0);
}
答案 0 :(得分:6)
XOR是交换变量的糟糕方式。只需申报临时和使用作业。
XOR技巧:
x = x ^ y;
y = y ^ x;
x = x ^ y;
如果x
和y
在内存中的位置相同,则会失败;然后它将值设置为0.
我没有详细分析你的代码,但我敢打赌这个:
a[i]=a[i] ^ a[min];
a[min]= a[min] ^ a[i];
a[i]= a[i] ^ a[min];
在i == min
时失败。
...
确认,我尝试使用添加的printf
语句运行程序,并使用指定的输入与i == min
交换至少一次。
答案 1 :(得分:0)
当两个指针指定相同的内存位置时,程序将失败。这称为内存别名。