1

これは、単純な選択ソートで発生する奇妙なエラーです。

次の入力を使用します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);
}
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

..。

確認済みですが、ステートメントを追加してプログラムを実行しようとしましたが、指定した入力を使用して、少なくとも1回printfはスワップを実行します。i == min

于 2012-08-06T22:33:16.057 に答える
0

2つのポインタが同じメモリ位置を指定すると、プログラムは失敗します。そして、これはメモリエイリアシングと呼ばれます。

于 2012-08-07T01:55:23.890 に答える