重複の可能性:
3 番目の変数を使用せずに 2 つの変数値を交換する
Quoraでこのコードに出会いました。C の場合:
a^=b^=a^=b;
Ruby/Python の場合:
a,b=b,a
a ^= b ^= a ^=b;
^
バイナリ XOR 演算子です。このコードには未定義の動作があることに注意してください。 と の値はa
、b
2 つのシーケンス ポイント間で 2 回変更されます。
C の例では、この同一の質問で読むことができる 2 つの数値を交換するためにいくつかのばかげたトリックを使用しています。
Ruby/Python の例では、はるかに賢明で読みやすいタプルのアンパックを使用しています。
もっと詳しく:
C: これは、3 番目の変数を持たない自慢の swap の変形ですが、判読できず、(Kirilenko が指摘するように) 未定義の動作を持ち、一般的に悪い考えです。整数バージョンには、起動時のオーバーフローの問題があります。C++ では、 を使用するstd::swap(a,b)
だけです。スワッピング メソッドを記述する際に注意すべきことの 1 つは、特に C で参照やポインターを使用している場合に、同じものが 2 回渡される可能性があることです。
Ruby/Python: タプルは a と b の値で構築され、コンマ区切りの変数リストへの割り当ては、無名タプルを分割して個々の変数値を割り当てることによって解釈されます。このメソッドは、「3 番目の変数」、つまり無名タプルを使用します。