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

C言語の#演算子と##演算子とは?文字列化演算子とトークン連結演算子の使い方

この記事では、C言語における文字列化演算子(#)トークン連結演算子(##)について解説します。どちらもプリプロセッサで動作する特殊な演算子であり、マクロ定義の中で使用されます。

文字列化演算子(#)とは

文字列化演算子(#)は、プリプロセッサ演算子の一つです。マクロ定義内で使用すると、引数として渡されたトークンを自動的に文字列リテラルへと変換するよう、コンパイラに指示します。

この演算子を使えば、ダブルクォート(")で囲むことなく、テキストをそのまま文字列として扱うことができます。

コード例

#include<stdio.h>
#define STR_PRINT(x) #x
main() {
    printf(STR_PRINT(This is a string without double quotes));
}

実行結果

This is a string without double quotes

この例では、STR_PRINTマクロに渡されたテキストが、#演算子によって自動的に文字列へ変換され、そのまま出力されています。ダブルクォートを記述していない点に注目してください。

トークン連結演算子(##)とは

トークン連結演算子(##)もプリプロセッサ演算子の一つです。マクロ定義内で使用すると、2つのトークンを結合して1つのトークン(または文字列)にするよう、コンパイラに指示します。

コード例

#include<stdio.h>
#define STR_CONCAT(x, y) x##y
main() {
    printf("%d", STR_CONCAT(20, 50));
}

実行結果

2050

この例では、STR_CONCAT(20, 50)と呼び出すことで、20と50という2つのトークンが##演算子によって結合され、2050という1つの数値として扱われています。

まとめ

両者の違いを整理すると以下のようになります。

  • #(文字列化演算子):1つのトークンを文字列リテラルに変換する
  • ##(トークン連結演算子):2つのトークンを結合して1つのトークンにする

どちらもマクロ定義内でのみ使用可能な演算子です。デバッグ用のログ出力マクロや、関数名・変数名を動的に生成したい場合などに活用できる、便利なプリプロセッサ機能です。

  1. 【JavaScript入門】Rest演算子とSpread演算子の違いと使い方を徹底解説

    Rest演算子(...)を使用すると、関数を任意の数の引数で呼び出し、余分な引数を1つの配列として受け取ることができます。また、配列やオブジェクトの分割代入(デストラクチャリング)の際にも活用できる便利な構文です。 一方、Spread演算子(...)は、配列などの反復可能なオブジェクト(イテラブル)を個々の要素へと展開するために使用します。 Rest演算子とSpread演算子の主な違い 両者は同じ「...」という記法ですが、使用する場所によって役割が異なります。 Rest演算子: 関数の仮引数や分割代入の左辺など、「複数の値をまとめて1つに集約」する場面で使用します。 Spread演算子:

  2. C言語で文字列⇔数値の相互変換を行う方法|sscanf関数とsprintf関数の使い方

    はじめにC言語のプログラミングにおいて、「文字列から数値への変換」および「数値から文字列への変換」とは何を意味するのでしょうか?本記事では、標準ライブラリ関数を使った双方向の変換方法を、構文・サンプルコード・実行結果とあわせて解説します。解決策:使用する2つの関数C言語には、この変換を実現するための関数が用意されています。sscanf() ― 文字列を数値に変換するsprintf() ― 数値を文字列に変換する文字列から数値への変換(sscanf)sscanf()関数を使うことで、文字列として格納されたデータを、書式指定子に従って解析し、数値として各変数に読み込むことができます。scanf()