変数の値を入れ替える(スワップ)処理を理解しよう

C# 入門者向け解説記事

1. はじめに

2 つの変数 a と b の値を入れ替える(スワップする)処理は、アルゴリズム学習の入り口として定番のテーマです。ここでは 一時変数(temp)を使う基本形 と C# 7.0 以降で使えるタプル構文 の 2 通りを中心に、サンプルコードの各行が果たす役割をていねいに解説します。


2. 完成コード全体

// 1. a, b の入力
Console.Write("a の初期値を入力してください: ");
int a = int.Parse(Console.ReadLine());

Console.Write("b の初期値を入力してください: ");
int b = int.Parse(Console.ReadLine());

Console.WriteLine($"\n<スワップ前> a = {a},  b = {b}");

// 2. 値の入れ替え(基本形)
int temp = a;
a = b;
b = temp;

// C# 7.0 以降であればタプル構文も可
// (a, b) = (b, a);

// 3. 結果表示
Console.WriteLine($"<スワップ後> a = {a},  b = {b}");

3. 行ごとの詳細ガイド

区分意図
入力Console.Write(“a の初期値…");変数 a の初期値入力をユーザーに促すプロンプト表示
int a = int.Parse(Console.ReadLine());キーボード入力された文字列を整数に変換して a に格納
(同様に b を取得)
経過表示Console.WriteLine($"\n<スワップ前> …");入れ替え前の状態を確認用に出力
スワップint temp = a;一時変数 temp を用意し、a の値を待避
a = b;先に b の値を a にコピー
b = temp;待避していた元の a の値を b にコピー
タプル構文(任意)(a, b) = (b, a);右辺のタプルを左辺に分解代入することで一行でスワップ(C# 7.0+)
結果表示Console.WriteLine($"<スワップ後> …");入れ替え後の値を表示し、動作確認

1. ざっくり一文で言うと

キーボードから打ち込んだ文字列を整数に変換し,その整数を a という変数にしまっている ― これがこの 1 行の仕事です。


2. 3 つのパーツに分けてみる

パーツ役割たとえ話
Console.ReadLine()入力ステージ:エンターキーが押されるまで,ユーザーの打ち込んだ文字列(例:"42″)を丸ごと受け取る「受付箱」にメモが投函されるイメージ
int.Parse( … )変換ステージ:受け取った文字列を 整数型 (int) として読める形に変換する(文字列 “42" → 数値 42)メモの数字を本物のコインに両替
int a = … ;格納ステージ:変換された整数を “a” と書いたコップに入れるコインを“a”ラベルのコップに投入

3. もう少し詳しく:内部で起きていること

  1. 入力待ち
Console.ReadLine();
  • ここでプログラムが一時停止し,ユーザーが数字などをタイプして Enter を押すまで待機します。
  • 返り値(戻り値)は 必ず文字列(string 型)。
  1. 文字列 → 整数へのキャスト(型変換)
int.Parse(文字列);
  • int.Parse は 「その文字列が本当に整数表現か?」 をチェックし,問題なければ整数値に変換します。
  • もし数字以外の文字が混じっていると FormatException が発生し,プログラムはエラー終了します。
  • 安全に書きたいときは int.TryParse を使う方法もある、というのが次のステップ。
  1. 変数宣言と同時代入
int a = 変換結果;
  • ここでメモリ上に 32 ビットの整数変数 a を確保。
  • その領域に変換済みの数値をコピーして完了。

4. 失敗しないためのワンポイント

よくある疑問/ミス解説
数字以外を入力されたら?int.Parse は例外を投げるので,実運用では TryParse を検討しましょう。if (int.TryParse(Console.ReadLine(), out int a)) { … }
小数(例:3.14)を入れたいdouble.Parse など 別の型 に変換する。整数専用の int.Parse ではエラーになります。
変数名は a でよい?学習サンプルでは OK ですが,実務では「意味が分かる名前」を推奨。例:age, score, itemCount など。

5. まとめ

  • ReadLine → Parse → 代入 の 3 ステップを一行で実行しているだけ。
  • 変数を“箱(コップ)”,Parse を“両替”と考えるとイメージしやすい。
  • 例外処理(TryParse)も覚えると,より堅牢な入力プログラムを書けるようになります。

このしくみを理解しておくと,ユーザー入力を扱うときに「どこで文字列を数値に直し,どこで保存するか」がはっきり見えるようになります。ぜひ手を動かして確認してみてください。


4. 基本形(temp 方式)のメリットと注意点

観点ポイント
安全性同じ型の一時変数を 1 つ用意するだけで、演算や副作用を気にせず確実に入れ替えられる
可読性どの言語でも通用するオーソドックスな書き方で、学習用サンプルとして最適
パフォーマンスヒープ割り当ては発生せず、整数なら 4 バイトのレジスタ/スタック操作のみで高速
注意点参照型の場合は「参照が入れ替わる」だけで、オブジェクトの 中身がコピーされるわけではない ことに留意

5. タプル構文によるスワップ

(a, b) = (b, a);
  • 対応バージョン: C# 7.0 以上
  • 仕組み: 右辺 (b, a) で2値のタプルを生成 → 左辺のタプル (a, b) に分解代入
  • メリット:
    • コードが一行で書け、意図が直感的
    • ジェネリック型や複数戻り値を扱うメソッドとも相性が良い
  • デメリット:
    • C# 6.0 以前では使えない
    • 一時的にタプルオブジェクトを生成するため、値型どうしの入れ替えなら temp 方式よりわずかにオーバーヘッドがある

1. 変数は「ラベルが貼られたコップ」

  • int a = 5; は “a” と書かれたコップに「5」というビー玉を入れるイメージ
  • int b = 9; なら “b” と書かれたコップに「9」が入る

2. スワップでやりたいこと

コップ a と b に入っているビー玉を丸ごと交換したい。

そのまま入れ替えようとすると、先に入っているビー玉がこぼれてしまいます。

そこで 一時コップ(temp) を用意します。

3. 手順を紙芝居で

手順どのコップに何が入るか
① temp = atemp: 5 / a: 5 / b: 9
② a = btemp: 5 / a: 9 / b: 9
③ b = temptemp: 5 / a: 9 / b: 5

結果として a が 9、b が 5 になり、入れ替え完了。

ポイントは 「失くさないように一度 temp に避難させる」 ことです。

4. コードにすると

int temp = a; // ①
a = b;        // ②
b = temp;     // ③

5. C# 7.0 以降なら “魔法の一行”

(a, b) = (b, a);   // タプル構文
  • 右側 (b, a) で “9 と 5” というペアを作り
  • 左側 (a, b) に まとめて代入 しているイメージ
  • 実際は内部で temp 的な働きをする仕組みが用意されているので、初心者は「裏で同じことをしてくれている」と覚えれば十分です

6. よくある疑問

QA
temp を使わずに足し算・引き算でもできる?できますが、桁あふれ(オーバーフロー)や読みづらさのため初心者にはおすすめしません。
参照型(オブジェクト)の場合は?“参照先” が入れ替わるだけで、オブジェクトの中身そのものはコピーされません。

まとめ

  • スワップは「こぼさないように一時避難させる」だけのシンプルな操作
  • temp を使う方法をまず身につける
  • モダン C# ならタプル構文でさらに簡潔に書けるこの基礎を知っておくと、配列やリストの並べ替えアルゴリズム(バブルソートなど)を学ぶときにスムーズに理解できます。

6. 番外編:算術演算を利用したスワップは推奨しない

a = a + b;
b = a - b;
a = a - b;
  • 整数オーバーフロー のリスクがある
  • 可読性が下がり、保守性が悪化→ 学習用途を除き 一時変数 もしくは タプル構文 を選びましょう。

7. まとめ

  1. まずは temp 方式 をマスター
  2. C# 7.0 以降なら タプル構文 が簡潔で読みやすい
  3. 算術演算スワップは実用コードでは避ける

これで、変数スワップの基本と最新の書き方の違いが理解できたはずです。実際にコードを動かし、入力値 → スワップ → 出力 の流れを体験することで、変数の値がどのようにメモリ上でコピーされるかイメージできるようになります。

訪問数 22 回, 今日の訪問数 1回

C#

Posted by hidepon