知らない演算子があったとは
『独習C』第3版を立ち読みしていて発見。
#include<stdio.h> #define QUOTE(s) puts(#s) int main(int argc, char *argv[]) { QUOTE(Hello World); /* puts("Hello World") */ QUOTE(Hello World); /* puts("Hello World") */ QUOTE(Hello+World); /* puts("Hello+World") */ QUOTE("Hello\World"); /* puts("\"Hello\\World\"") */ exit(0); }
Hello World Hello World Hello+World "Hello\World"
- #演算子
- 形式:#op1
関数形式マクロの置換の並びにおいて、実引数を通常文字列リテラル化する。前後の空白は削除、連続する空白は1個の空白になる。"と¥は直前に¥が挿入される。
参考:平林雅英『新ANSI C言語辞典』
#include<stdio.h> #define OP(i) op##i int main(int argc, char *argv[]) { int op1 = 10; int op2 = 25; printf("%d\n", (OP(1) - OP(2))); /* op1 - op2 */ printf("%d\n", (OP(2) - OP(1))); /* op2 - op1 */ exit(0); }
-15 15
- ##
- 形式:op1##op2
置換の並びにおいて、前処理字句を連結する。
参考:平林雅英『新ANSI C言語辞典』
##はもう少し複雑な構造で使って、初めて効果が分かるかも。