三字符序列
三字符序列(trigraph sequences):在进行任何其它处理前,三字符序列会被替换为对应的单个字符。三字符序列以两个?字符开始,第三个字符决定三字符序列表示的符号。使用三字符序列能够输入未在ISO/IEC 646标准固定代码集(Invariant Code Set)中定义的字符(该固定代码集是7位ASCII字符集的子集。)。ISO/IEC 9899:2018标准第5.2.1.1 Trigraph sequences节提供了9个三字符序列,具体如下:
三字符序列 | 表示字符 | 三字符序列 | 表示字符 | 三字符序列 | 表示字符 |
??= | # | ??) | ] | ??! | | |
??( | [ | ??' | ^ | ??> | } |
??/ | \ | ??< | { | ??- | ~ |
三字符序列在c程序编译的第一阶段替换成对应的单字符,例如:
??=include <stdio.h>
将替换为
#include <stdio.h>
不是开始三字符序列的?字符在编译时不会发生这种替换,例如:
puts("???=");
将输出
?#
如果不希望三字符序列在编译时被替换成单字符,可以使用转义序列表示?字符,例如:
puts("?\?\?=");
将输出
???=
编译时三字符序列的替换先于转义序列的替换,例如:
puts("\\??=");
将输出
\#