【プログラミング】2つの変数の値を入れ替える4つの方法

アルゴリズム

プログラミングをしてみると、2つの変数の値を入れ替える場面が出てくることがあります。

何かを開発していた訳でなくても、学校の課題でも出題されることも少なくありません。

この記事では2つの変数の値を入れ替える方法を紹介しています。

プログラムだけ知りたい方は以下のサンプルコードを参考にしてください(この記事ではC言語を使用しています)。


2つの値を入れ替える方法

2つの変数の値を入れ替える方法はいくつかありますが、まずはダメな例から見ていきましょうか。

int a = 10;
int b = 5;

a = b;
b = a;

このコードで上手くいくと思って実行してみると、a,b両方の値が10になっているのが確認できるはずです。

問題点

このコードの問題は、aの値を退避させずにbを代入してしまっている点です。

  1. aにb(5)を代入してaの値が5になる
  2. 次に、bにa(5)を代入する
  3. 結果、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;

このプログラムを簡単に解説すると、

  1. b(3)にa(8)-b(3)代入する。この時点でbは5
  2. aにa(8)-b(5)を代入する。この時点でaは3
  3. bにa(3)+b(5)を代入する。この時点でbは8
  4. これで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倍くらい)関係で処理速度が非常に遅いので実用性はありません。

こんな方法でもできるんだよと覚えておくといいでしょう。

【ピックアップ】

ピックアップ

初心者にとって、プログラムだけで処理の流れをイメージすることは非常に難しいです。

そこで役立つならアルゴリズム図鑑。図解を使って解説されているので、どんなプログラミング言語にも応用できます。

アルゴリズムそのものを理解することができるので、C言語ではかけるけどJavaScriptでは書けないといった問題を事前に解決できます。

Amazonにて中身検索もできるため、一度チェックしてみると良いでしょう。

関連記事
Acceliv