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

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

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

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

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

 
int i = 0;

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にて中身検索もできるため、一度チェックしてみると良いでしょう。

 

コメント

タイトルとURLをコピーしました

Fatal error: Uncaught Error: Call to undefined function WP_Optimize() in /home/c8142937/public_html/careru.jp/develing/wp-content/plugins/wp-optimize/cache/file-based-page-cache-functions.php:149 Stack trace: #0 [internal function]: wpo_cache('<!doctype html>...', 9) #1 /home/c8142937/public_html/careru.jp/develing/wp-includes/functions.php(4552): ob_end_flush() #2 /home/c8142937/public_html/careru.jp/develing/wp-includes/class-wp-hook.php(288): wp_ob_end_flush_all('') #3 /home/c8142937/public_html/careru.jp/develing/wp-includes/class-wp-hook.php(312): WP_Hook->apply_filters('', Array) #4 /home/c8142937/public_html/careru.jp/develing/wp-includes/plugin.php(478): WP_Hook->do_action(Array) #5 /home/c8142937/public_html/careru.jp/develing/wp-includes/load.php(947): do_action('shutdown') #6 [internal function]: shutdown_action_hook() #7 {main} thrown in /home/c8142937/public_html/careru.jp/develing/wp-content/plugins/wp-optimize/cache/file-based-page-cache-functions.php on line 149