C言語パズル:演算や関数を使わずに2つの数値を連結する方法
今回は、C言語のプログラミングパズル問題を紹介します。2つの数値「48」と「96」があるとします。1つ目の数値を2つ目の数値の後ろに連結して、「9648」という結果を得たいのです。ただし、論理演算・算術演算・文字列操作は一切禁止、さらに標準ライブラリの関数も使用不可という条件が付きます。さて、どうすれば実現できるでしょうか?
解決策:トークン連結演算子(##)
答えはとてもシンプルです。C言語のトークン連結演算子(##)を使えば解決できます。この演算子はプリプロセッサ演算子の一種で、2つのトークンを1つに結合するようコンパイラへ指示します。実際に使用するのは、ソースコード内ではなくマクロ定義の中です。
コード例
#include<stdio.h>
#define MERGE(x, y) y##x
main() {
printf("%d", MERGE(48, 96));
}
実行結果
9648
解説
マクロ MERGE(48, 96) は、y##x の展開によって 9648 という1つの数値トークンに変換されます。これは実行時に行われる文字列処理ではなく、プリプロセス段階でトークン同士が直接結合される仕組みのため、算術演算やライブラリ関数に一切依存せずに連結が実現できます。
なお、引数の順序にも注目しましょう。MERGE(x, y) では第1引数 x が後ろ、第2引数 y が前に配置されるため、MERGE(48, 96) は「96」+「48」の順に結合され、結果として 9648 が出力されます。
-
Rubyで作るおもちゃのプログラミング言語「Stoffle」入門
プログラミング言語は、不思議でありながら魅力的な道具だと感じたことはありませんか?そのフードを覗き込み、内部で何が起きているのかを理解できたら素晴らしいと思いませんか?ゼロからプログラミング言語を作ってみたいという興味をお持ちなら、この記事と今後のシリーズ記事がきっと役立つはずです。 このシリーズでは、非常にシンプルなインタプリタ型・動的型付けのプログラミング言語を、ステップバイステップで一緒に作り上げていきます。「インタプリタ型」「動的型付け」といった用語の意味が今ひとつピンとこなくても、心配はいりません。実装には親しみやすいRubyを使い、初心者から上級者まで誰でもついてこられるよう、各
-
今こそ学ぶべきプログラミング言語おすすめTOP10
テクノロジーの進化により、私たちの世界は日々便利で豊かなものになっています。ハードウェアの進歩とともに、ソフトウェアも0と1だけのバイナリ言語から、自然言語に近い高度なプログラミング言語へと大きく進化してきました。プログラミング言語の普及に伴い、業界では特定の言語スキルが高収入の求人に有利になる傾向が強まっています。キャリアアップにつながる最適な言語を選びたい方に向けて、就職・転職に強いおすすめのプログラミング言語をランキング形式でご紹介します。 今学ぶべきプログラミング言語ベスト10 学ぶ言語を選ぶ際は、その言語がキャリアをどれだけ前進させられるか、自分のキャリア目標と合致しているかを考慮す