知らない演算子があったとは

フロム中武

『独習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言語辞典

##はもう少し複雑な構造で使って、初めて効果が分かるかも。