プログラミングの勉強をしていると、2つの変数の値を入れ替える場面が出てくることがあります。
何かを開発していた訳ではなく、学校の課題でも出題されることも多いです。この記事では2つの変数の値を入れ替える方法を4つ紹介しています。
2つの値を入れ替える方法
2つの変数の値を入れ替える方法はいくつかありますが、まずはダメな例から見ていきましょう。
int a = 10;
int b = 5;
a = b;
b = a;
このコードで上手くいくと思って実行してみると、a,b両方の値が10になっているのが確認できるはずです。
問題点
このコードの問題は、aの値を退避させずにbを代入してしまっている点です。
- aにbを代入してaの値が5になる
- 次に、bにaを代入する
- 結果、aとbが両方とも5となり、値の入れ替えに失敗する
このように、両方の値が同じ値になってしまうので、ただ代入するコードを2行書くだけではだめなのです。
この駄目なコードについてわかったところで、ちゃんと変数の値を交換できる方法を紹介していきます。
値の入れ替えを行う方法
一時記憶用変数を使う(カンタン)
最も簡単で最も利便性が高いやり方です。
一時的に変数を1つ増やして、入れ替える変数のうち一つを退避させて行う方法で、数値や文字列など様々な変数の値を交換できます。
int a = 10;
int b = 5;
int c;
c = a;
a = b;
b = c;
一度変数aを変数cに代入することで、変数aを代入しても大丈夫な状態にしています。
bをaに代入してもaの値はcに入っているため、最後にcをbに代入することで値の交換が完了するのです。
よっぽどメモリの制約が厳しい場合でない限り、この方法がいいでしょう。可読性も落ちずに見やすいコートになるはずです。
加算・減算を使う
数値限定ですが、加算と減算を使うことでも値の交換ができます。
int a = 8;
int b = 3;
b = a - b;
a = a - b;
b = a + b;
このプログラムを簡単に解説すると、
- b(3)にa(8)-b(3)代入する。この時点でbは5
- aにa(8)-b(5)を代入する。この時点でaは3
- bにa(3)+b(5)を代入する。この時点でbは8
- これでaが3、bが8になり、値の交換が完了する
このようになり、変数を1つ増やさなくても値の交換をできます。
排他的論理和を使う(難しい)
難しい方法ですが、排他的論理和(XOR)を使うことでも値の交換ができます。
やっていることはビット演算なので、加算・減算でやる方法よりも高速で、一時変数も使いません。
int a = 8;
int b = 3;
b = b ^ a;
a = a ^ b;
b = a ^ b;
こちらも演算するため数値限定の値交換方法です。
文字列やクラス・構造体ではこの方法で値を交換できないので注意してください。
乗算・除算を使う(おすすめしない)
おまけ的なやつです、aとbが0じゃないときに限り、以下のコードでも交換できます。
double a = 8;
double b = 3;
b = a / b;
a = a / b;
b = a * b;
ただし、除算のコストがびっくりするくらい高い(コンパイラが最適化しないと加算の10倍くらい時間がかかる)関係で処理速度が非常に遅いので実用性はありません。
こんな方法でもできるということを覚えておくといいでしょう。
【ピックアップ】
アルゴリズム図鑑 絵で見てわかる26のアルゴリズム
初心者にとって、プログラムだけで処理の流れをイメージすることは非常に難しいです。
そこで役立つならアルゴリズム図鑑。図解を使って解説されているので、どんなプログラミング言語にも応用できます。
アルゴリズムそのものを理解できるので、C言語ではかけるけどJavaScriptでは書けないといった問題を事前に解決できます。
Amazonにて中身検索もできるため、一度チェックしてみると良いでしょう。