C/C++で第3の変数を使わずに2つの変数の値を交換する方法
はじめに
通常、C言語やC++で2つの変数の値を交換(スワップ)する際には、一時的な第3の変数が必要になります。しかし、算術演算を工夫することで、第3の変数を一切使わずに値を交換することも可能です。
以下は、その手法を用いたサンプルプログラムです。
サンプルコード
#include <stdio.h>
int main() {
int a,b;
printf("Enter the value of a : ");
scanf("%d", &a);
printf("\nEnter the value of b : ");
scanf("%d", &b);
a += b -= a = b - a;
printf("\nAfter Swapping : %d\t%d", a, b);
return 0;
}
実行結果
Enter the value of a : 23 Enter the value of b : 43 After Swapping : 4323
プログラムの解説
上記のプログラムでは、まず2つの整数型変数aとbを宣言し、実行時にユーザーからの標準入力によって動的に値を設定しています。
int a,b;
printf("Enter the value of a : ");
scanf("%d", &a);
printf("\nEnter the value of b : ");
scanf("%d", &b);
その後、わずか1行のコードで第3の変数を使用せずに2つの数値を交換しています。
a += b -= a = b - a;
処理の流れ
この複合代入式は右から左へ評価されます。具体的な処理の流れは以下の通りです。
- a = b - a; — まずaに「b − a」の差分が代入されます。この時点でaは両者の差を保持します。
- b -= a; — 次にbから新しいa(元のb − 元のa)を減算します。これによりbは元のaの値になります。
- a += b; — 最後にaに新しいb(元のa)を加算します。これによりaは元のbの値になります。
例として、a=23、b=43の場合を考えてみましょう。
- a = 43 − 23 = 20
- b = 43 − 20 = 23
- a = 20 + 23 = 43
このように、加減算のみを組み合わせることで、一時変数なしで2つの変数の値を交換できます。ただし、大きな値を扱う場合は中間計算によるオーバーフローに注意が必要です。また、可読性の観点から、実際の開発現場では第3の変数を使う従来の方法が推奨されることも多い点も覚えておきましょう。
-
C++での変数の初期化|静的初期化と動的初期化の違いを解説
C++における変数の初期化とは 変数とは、ユーザーが任意につける名前のことで、データを格納するための「箱」のような役割を持ちます。変数を宣言・初期化する際にはデータ型を使用し、その変数用のメモリが割り当てられます。C++にはint(整数型)、char(文字型)、float(浮動小数点型)など、用途に応じたさまざまなデータ型が用意されています。 変数の初期化方法は、大きく分けて次の2つがあります。 静的初期化(static initialization) − プログラムのコード内であらかじめ値を代入する方法 動的初期化(dynamic initialization) − プログラムの実行時(
-
C#で一時変数を使わずに2つの文字列を入れ替える方法
C#プログラミングにおいて、通常は一時変数(テンポラリ変数)を使って2つの文字列の値を入れ替えますが、実は一時変数なしでも文字列の連結とSubstringメソッドを組み合わせることで、同じことが実現できます。この記事では、その具体的な手順とサンプルコードをわかりやすく解説します。基本的な考え方一時変数を使用せずに2つの文字列を入れ替えるには、以下の手順に従います。ステップ1:2番目の文字列を1番目の文字列に連結するまず、str2をstr1に連結して、両方の文字列を含む1つの文字列を作成します。str1 = str1 + str2;ステップ2:str1の元の部分をstr2に設定するSubstri