Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++で1行のコードを使って2つの変数を入れ替える方法


C言語では、一時的な変数(テンポラリ変数)を使わずに、たった1行のコードで2つの変数の値を入れ替えることができます。ここでは、代表的な2つの方法をサンプルコード付きで紹介します。

サンプルコード

#include <stdio.h>
int main() {
    int a = 28, b = 8;
    a += b -= a = b - a; // 方法1
    printf("After Swapping : %d\t%d", a, b);
    (a ^= b), (b ^= a), (a ^= b); // 方法2
    printf("\nAfter Swapping again : %d\t%d", a, b);
    return 0;
}

実行結果

After Swapping : 8	28
After Swapping again : 28	8

上記のプログラムでは、2つの変数 a と b をそれぞれ 28 と 8 で初期化しています。2つの数値を1行で入れ替える手法はいくつかありますが、ここでは代表的な2つの方法を取り上げます。

a += b -= a = b - a; // 方法1
printf("After Swapping : %d\t%d", a, b);
(a ^= b), (b ^= a), (a ^= b); // 方法2
printf("\nAfter Swapping again : %d\t%d", a, b);

方法1:算術演算を使った入れ替え

代入演算子は右から左へと評価されるため、まず a = b - a が実行され、次に b -= a、最後に a += b が処理されます。この連鎖的な代入によって、一時変数を介さずに値が交換されます。

方法2:XOR(排他的論理和)を使った入れ替え

XOR演算には「同じ値同士のXORは0になる」「任意の値と0のXORは元の値に戻る」という性質があります。この性質を利用し、(a ^= b), (b ^= a), (a ^= b) の3ステップを実行するだけで、変数の値を入れ替えられます。

注意点

これらの手法はコードを簡潔にできる反面、可読性が低下しやすいという欠点があります。また、XOR方式では同じメモリ位置を参照している場合に正しく動作しないといった落とし穴もあります。実務では、一時変数を使う標準的な方法や、C++であれば std::swap を利用するのが安全で推奨されるアプローチです。

  1. C言語のビット演算子(XOR)を使って2つの数値を交換する方法

    C言語では、一時変数を使用せずに、ビット演算子(XOR)だけで2つの数値を交換することができます。この記事では、その仕組みと具体的な実装方法を解説します。 問題 Cプログラミングにおいて、ビット演算子を使って2つの数値を交換するにはどうすればよいのでしょうか。 解決策 コンパイラは、まず与えられた10進数を2進数に変換します。その後、ビットごとのXOR演算を実行することで、メモリ上の別の場所へ数値を交換します。この方法の最大の特徴は、第3の変数(一時変数)が不要という点です。 アルゴリズム 処理の手順は以下の通りです。 START Step 1: 2つの変数 a と b を宣言する Step

  2. C/C++における引数の型強制(Argument Coercion)とは?仕組みとサンプルコードで解説

    本記事では、C言語およびC++における「引数の型強制(Argument Coercion)」について解説します。引数の型強制とは、関数に渡された引数の型を、コンパイラがある型から別の型へ自動的に(暗黙的に)変換する仕組みのことです。この変換は「引数の昇格ルール(argument promotion rule)」に従って行われます。つまり、より小さいデータ型の引数は、より大きいデータ型へと変換されますが、その逆の変換は行われません。なぜなら、大きなデータ型から小さなデータ型へ変換すると、データの一部が失われる(桁あふれや精度の低下が発生する)恐れがあるためです。暗黙的な型変換がどのように行われる