変数の値を入れ替える(スワップ)処理を理解しよう
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. もう少し詳しく:内部で起きていること
- 入力待ち
Console.ReadLine();
- ここでプログラムが一時停止し,ユーザーが数字などをタイプして Enter を押すまで待機します。
- 返り値(戻り値)は 必ず文字列(string 型)。
- 文字列 → 整数へのキャスト(型変換)
int.Parse(文字列);
- int.Parse は 「その文字列が本当に整数表現か?」 をチェックし,問題なければ整数値に変換します。
- もし数字以外の文字が混じっていると FormatException が発生し,プログラムはエラー終了します。
- 安全に書きたいときは int.TryParse を使う方法もある、というのが次のステップ。
- 変数宣言と同時代入
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 = a | temp: 5 / a: 5 / b: 9 |
② a = b | temp: 5 / a: 9 / b: 9 |
③ b = temp | temp: 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. よくある疑問
Q | A |
---|---|
temp を使わずに足し算・引き算でもできる? | できますが、桁あふれ(オーバーフロー)や読みづらさのため初心者にはおすすめしません。 |
参照型(オブジェクト)の場合は? | “参照先” が入れ替わるだけで、オブジェクトの中身そのものはコピーされません。 |
まとめ
- スワップは「こぼさないように一時避難させる」だけのシンプルな操作
- temp を使う方法をまず身につける
- モダン C# ならタプル構文でさらに簡潔に書けるこの基礎を知っておくと、配列やリストの並べ替えアルゴリズム(バブルソートなど)を学ぶときにスムーズに理解できます。
6. 番外編:算術演算を利用したスワップは推奨しない
a = a + b;
b = a - b;
a = a - b;
- 整数オーバーフロー のリスクがある
- 可読性が下がり、保守性が悪化→ 学習用途を除き 一時変数 もしくは タプル構文 を選びましょう。
7. まとめ
- まずは temp 方式 をマスター
- C# 7.0 以降なら タプル構文 が簡潔で読みやすい
- 算術演算スワップは実用コードでは避ける
これで、変数スワップの基本と最新の書き方の違いが理解できたはずです。実際にコードを動かし、入力値 → スワップ → 出力 の流れを体験することで、変数の値がどのようにメモリ上でコピーされるかイメージできるようになります。
ディスカッション
コメント一覧
まだ、コメントがありません