C# で一時変数を使用せずに変数値を交換する

Bilal Shahid 2023年10月12日
  1. C# でタプル代入を使用する
  2. C# で使用する一時的な変数を回避するために+ 演算子を使用する
  3. 明示的な実装ではなく関数を使用して値を交換し、C# での一時変数の使用を非表示にする
  4. C#XOR 演算子を使って入れ替えを行う方法
C# で一時変数を使用せずに変数値を交換する

それで、あなたが今コードを書いていて、変数値を交換したいとしましょう。あなたはおそらくこのようなことをするでしょう:

using System;

public class Program
{
  public static void Main(string[] args)
  {
      var val_one = 123;
      var val_two = 234;

      var val_swap = val_one;
      val_one = val_two;
      val_two = val_swap;

      Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);
  }
}

ここで、最初に val_swap という一時変数を作成し、次に val_one 値をコピーして、val_one 値を変更した後、元の val_one 値を val_two に簡単にコピーできるようにします。val_swap からの値をそれに割り当てることによって。

今日は、この一時変数の使用を排除し、他の割り当てなしでそのような交換を実行することを検討します。

C# でタプル代入を使用する

現在利用できる非常に簡単な方法は、次のように TUPLE 割り当てを使用することです。

(val_one, val_two) = (val_two, val_one);

Console.WriteLine("The value after swapping from the tuple method is: " + val_one + " and -> " +
                  val_two);

出力:

The value after swapping from the tuple method is: 234 and -> 123

このメソッドは Python でも使用されています。ただし、タプルの影響を受けません。

ただし、必要なものを取得するためにトリックを使用しなければならない場合があります。以下の例を見てみましょう。

C# で使用する一時的な変数を回避するために+ 演算子を使用する

79 という 2つの数字があるとします。最初の変数の値は 7 で、2 番目の変数の値は 9 です。

79 を追加すると、16 になります。ここで、最初の変数に 16 を割り当てましょう。

最初の変数の値として 9 を入力するには、2 番目の変数から 9 の値を差し引く必要があります。これは 15-9 = 7 になります。この値を使用し、最初の変数の 15 から減算して、値 9 を取得します。

val_one += val_two;
val_two = val_one - val_two;
val_one = val_one - val_two;

Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);

出力:

The value after swapping is: 234 and -> 123

これが単純な算術を使用して、スワッピング中に一時変数の使用を停止する方法に気付くでしょう。一方、非常に大きな正確な値がある場合、これは効果がなくなる可能性があり、そのような演算を使用すると、一部の値が失われる可能性があります。

一時変数の使用を削除するだけでなく、実装を非表示にする場合は、次のようなものを使用できます。

明示的な実装ではなく関数を使用して値を交換し、C# での一時変数の使用を非表示にする

あなたは次のように何かをすることができます。

static void swap(ref int x, ref int y) {
  var temp = x;
  x = y;
  y = temp;
}

そして、それを以下のように呼びます:

swap(ref val_one, ref val_two);
Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);

出力:

The value after swapping is: 234 and -> 123

C#XOR 演算子を使って入れ替えを行う方法

以下のコードを見てみましょう。

val_one ^= val_two ^= val_one ^= val_two;

そしてその出力:

The value after swapping is: 0 and -> 123

2 番目の変数が最初の変数の値を持ち、正しく機能しているにもかかわらず、最初の値が 0 であることに気付くでしょう。

では、これをどのように修正しますか?まず、次のようなコードを書いてみましょう。

val_one ^= val_two;
val_two ^= val_one;
val_one ^= val_two;

そして今、出力は次のとおりです。

The value after swapping is: 234 and -> 123

どうしたの?最初に、最初のステートメントで指定されたコードを理解しましょう。

これは次のように拡張できます。

val_one = val_one ^ val_two;
val_two = val_two ^ val_one;
val_one = val_one ^ val_two;

これで、最初のコードは後で提示するコードと似ていると言えますが、どのように機能していませんが、後者はうまく機能しますか?

これらの算術演算の順序を変更すると、異なる結果が得られる可能性があります。前者のコードでは、val_one はそれ自体に XOR を持っているため、結果は 0 になります。

ただし、後者の場合、順序はすでに定義されており、値は完全に計算されるため、違いが生じます。

ただし、より高いコードレベルには XOR スワッピングを使用しないでください。安全ではないため、代わりに保管する必要があります。

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub