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

C言語パズル:演算子なしで2つの数値を連結して「9648」を作る方法

今回は、C言語のパズル問題を1つ紹介します。2つの数値「48」と「96」が与えられたとしましょう。ここで、1つ目の数値を2つ目の数値の後ろに連結して、「9648」という結果を得たいと思います。

問題の条件

ただし、この問題には厳しい制約があります。

  • 論理演算を使用してはならない
  • 算術演算(加算・乗算など)を使用してはならない
  • 文字列に関する操作を使用してはならない
  • 定義済みのライブラリ関数も呼び出せない

一見すると不可能に思えますが、実はとても簡単に解決できるのです。

解決策:トークン連結演算子(##)

鍵となるのが、C言語のトークン連結演算子(Token Pasting Operator:##)です。これはプリプロセッサ演算子の一種で、マクロ定義の中で使用すると、2つのトークンを1つに結合(連結)するようコンパイラに指示します。数値の計算ではなく、ソースコード上のトークンそのものを貼り合わせるため、上記の制約をすべて回避できます。

コード例

#include<stdio.h>
#define MERGE(x, y) y##x
int main() {
    printf("%d", MERGE(48, 96));
    return 0;
}

実行結果

9648

コードの解説

マクロ MERGE(x, y)y##x として定義されているため、引数の順序が入れ替わります。つまり MERGE(48, 96) と呼び出すと、x に 48、y に 96 が渡され、y##x96##48 という1つのトークンに展開されます。その結果、数値リテラル 9648 がそのまま printf に出力される仕組みです。

なお、このテクニックはコンパイル前のプリプロセス段階で処理されるため、実行時の計算にはなりません。同じ要領で、識別子名の動的な生成などにも応用できる便利な機能です。

  1. MySQLのNOT演算子の使い方|!演算子との違いを解説

    MySQLでは、論理否定(NOT)を表現する方法として「!」演算子も使用できますが、同じ結果を得るのであれば「NOT」キーワードを使うことが推奨されます。MySQLには標準でNOTキーワードが用意されているためです。この記事では、実際にテーブルを作成し、NOTキーワードの動作を確認していきます。 サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table DemoTable1560     -> (     -> Value1 int  &n

  2. 【C言語】再帰関数を使って2つの整数の最大公約数(GCD)を求める方法

    問題 C言語において再帰関数を使用し、与えられた2つの整数の最大公約数(GCD:Greatest Common Divisor)を求めます。 解決策 再帰関数を用いて2つの整数の最大公約数を求めるには、「ユークリッドの互除法」が利用できます。これは「2つの数のGCDは、大きい方の数を小さい方の数で割った余りと、小さい方の数とのGCDに等しい」という性質を応用した手法です。この計算を余りが0になるまで再帰的に繰り返すことで、GCDを効率よく求めることができます。 アルゴリズム 再帰関数を使って2つの整数のGCDを求めるためのアルゴリズムは、以下の手順に従います。 ステップ1 − 再帰関数を