C 使用异或交换产生铁结果

C 使用异或交换产生铁结果,c,C,这是一个奇怪的错误,我得到了一个简单的选择排序 使用以下输入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");

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

使用以下输入
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);
}
#包括
int main()
{
int a[10]={'\0'};
int i=0,j=0,k=0;
int min=0;
printf(“输入10个元素\n”);

对于(i=0;iXOR)来说,交换变量是一种糟糕的方式。只需声明一个临时变量并使用赋值即可

异或技巧:

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
交换一次。

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
交换一次。

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

当两个指针指定相同的内存loca时否则,程序将失败。这称为内存混叠。

你说得对,当i==min时,它会失败。两个操作数都设置为零有什么特殊原因吗?赋值运算符不应该只将新值赋值给[i],而不影响[min]的值吗…不是。问题是,如果
x
y
是同一个对象,
x=x^y
同时修改
x
y
。任何与自身异或的数字都是零。交换两个变量的方法是
tmp=x;x=y;y=tmp;
(您还可以调整算法,使其不会不必要地尝试将元素与自身交换;这不一定是错误,但会造成浪费。)哦,好的..我以前一直使用临时变量交换方法,但是听说这是一种更有效的交换变量的方法,因为它没有额外变量的内存开销..所以只编写了一个程序来测试它..但是无论如何,谢谢..我会坚持使用临时变量进行测试..)使用xor交换两个变量是非常聪明的,从“聪明”这个词的不好的意义上说。如果它使程序不正确,那么额外的效率是毫无价值的。此外,在任何实现寄存器重命名的CPU上(并非所有CPU都这样做,但如果您关心的是性能而不是代码密度或电源效率,那么您可能正在使用一个),XOR技巧将变慢。你是对的,当i==min时失败,两个操作数都设置为零有什么特殊原因吗?赋值运算符不应该只将新值赋值给[i]而不影响[min]的值吗…不是。问题是,如果
x
y
是同一个对象,
x=x^y
同时修改
x
y
。任何与自身异或的数字都是零。交换两个变量的方法是
tmp=x;x=y;y=tmp;
(您还可以调整算法,使其不会不必要地尝试将元素与自身交换;这不一定是错误,但会造成浪费。)哦,好的..我以前一直使用临时变量交换方法,但是听说这是一种更有效的交换变量的方法,因为它没有额外变量的内存开销..所以只编写了一个程序来测试它..但是无论如何,谢谢..我会坚持使用临时变量进行测试..)使用xor交换两个变量是非常聪明的,从“聪明”这个词的不好的意义上说。如果它使程序不正确,那么额外的效率是毫无价值的。此外,在任何实现寄存器重命名的CPU上(并非所有CPU都这样做,但如果您关心的是性能而不是代码密度或电源效率,那么您可能正在使用一个),XOR技巧将变得更慢。