スワップに最適なアルゴリズムは "(a^=b^=a^=b)" であると友人から聞いたことがあります。ここで、a と b はスワップされる 2 つの整数です。しかし、C言語を使用してこれを適用すると、クラッシュしました。あなたの誰でも、その考えられる理由を説明できますか?スワッピングに最適なアルゴリズムを提案してください。ありがとうございました!!!!みんなクラッシュの理由を知りたいです。
6 に答える
a^=b^=a^=b;
恐ろしい未定義の動作を引き起こすため、おそらくクラッシュします。これが破る規則は、間にa
シーケンス ポイントを入れずに 2 回変更することです。たとえば、コンマ演算子を使用して、いくつかのシーケンス ポイントを挿入することで修正できます。
a ^= (b ^= a ^= b, b);`
または、複数のステートメントに分割することによって:
b ^= a ^= b; a ^= b;
ただし、これは通常、変数を交換するための悪い方法です。他のいくつかの回答とコメントで、その理由が適切に説明されています。
このスワッピング トリックは危険な場合があります。このスワップを使用して間違ったクイックソート プログラムが間違った結果を生成するのを見たことがあります。しかし、通常のスワップでは正しいプログラムが生成されます。
速度に関しては、tmp 変数を使用すると、コンパイラはより高速なコードを生成することがあります。
使用するtmp = a; a = b; b = tmp;
http://en.wikipedia.org/wiki/Swap_(computer_science)を参照してください。
一時変数を使用すると、より多くのオーバーヘッドが発生しますが、XOR スワップ アルゴリズムよりも安定しており、並列計算により、XOR スワップよりも高速にレンダリングされます。
スワッピングに一時変数を使用する確実な実装については、 http://www.ibm.com/developerworks/linux/library/l-metaprog1.htmlの最初のコード例を参照してください。
人間が読むのが速いコードを書いてください。そして、ほとんどの場合、より良いコードを生成するコンパイラーの能力を信頼してください。プロファイリングを実行して、これが速度を向上させる唯一の場所であるかどうかを確認します。次に、上記のXORソリューションを何度も適用します。すべての場所で機能するとは限りません。
数値には次のロジックを使用します。
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) ;