1

这是一个奇怪的错误,我得到一个简单的选择排序。

使用以下输入89,52,10,1,56,63,24,36,12,5

如果您要对其进行调试,您会注意到在第三次迭代期间,该行将 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);
}
4

2 回答 2

6

XOR 是一种糟糕的交换变量的方法。只需声明一个临时并使用分配。

XOR 技巧:

x = x ^ y;
y = y ^ x;
x = x ^ y;

如果xy是内存中的相同位置,则失败;然后它将值设置为0。

我没有详细分析你的代码,但我敢打赌:

a[i]=a[i] ^ a[min];
a[min]= a[min] ^ a[i];
a[i]= a[i] ^ a[min];

时失败i == min

...

确认后,我尝试使用添加的printf语句运行程序,并使用指定的输入i == min进行至少一次交换。

于 2012-08-06T22:33:16.057 回答
0

当两个指针指定相同的内存位置时,程序将失败。这称为内存别名。

于 2012-08-07T01:55:23.890 回答