6

スワップに最適なアルゴリズムは "(a^=b^=a^=b)" であると友人から聞いたことがあります。ここで、a と b はスワップされる 2 つの整数です。しかし、C言語を使用してこれを適用すると、クラッシュしました。あなたの誰でも、その考えられる理由を説明できますか?スワッピングに最適なアルゴリズムを提案してください。ありがとうございました!!!!みんなクラッシュの理由を知りたいです。

4

6 に答える 6

10

a^=b^=a^=b;恐ろしい未定義の動作を引き起こすため、おそらくクラッシュします。これが破る規則は、間にaシーケンス ポイントを入れずに 2 回変更することです。たとえば、コンマ演算子を使用して、いくつかのシーケンス ポイントを挿入することで修正できます。

a ^= (b ^= a ^= b, b);`

または、複数のステートメントに分割することによって:

b ^= a ^= b; a ^= b;

ただし、これは通常、変数を交換するための悪い方法です。他のいくつかの回答とコメントで、その理由が適切に説明されています。

于 2010-03-13T07:47:18.347 に答える
10

このスワッピング トリックは危険な場合があります。このスワップを使用して間違ったクイックソート プログラムが間違った結果を生成するのを見たことがあります。しかし、通常のスワップでは正しいプログラムが生成されます。

速度に関しては、tmp 変数を使用すると、コンパイラはより高速なコードを生成することがあります。

使用するtmp = a; a = b; b = tmp;

于 2010-03-13T05:24:22.683 に答える
3

http://en.wikipedia.org/wiki/Swap_(computer_science)を参照してください。

一時変数を使用すると、より多くのオーバーヘッドが発生しますが、XOR スワップ アルゴリズムよりも安定しており、並列計算により、XOR スワップよりも高速にレンダリングされます。

スワッピングに一時変数を使用する確実な実装については、 http://www.ibm.com/developerworks/linux/library/l-metaprog1.htmlの最初のコード例を参照してください。

于 2010-03-13T05:45:56.250 に答える
0

人間が読むのが速いコードを書いてください。そして、ほとんどの場合、より良いコードを生成するコンパイラーの能力を信頼してください。プロファイリングを実行して、これが速度を向上させる唯一の場所であるかどうかを確認します。次に、上記のXORソリューションを何度も適用します。すべての場所で機能するとは限りません。

于 2010-03-13T09:52:11.863 に答える
-1

数値には次のロジックを使用します。

    int a = 10, b =5 ;
    a = a-b;
    b = b+a ;         // b gets the original value of a
    a = b - a;    // a gets the original value of b
    printf ("value : %d %d \n",a ,b) ;
于 2010-03-13T05:40:41.157 に答える