三重符号(Trigraphs)

C 语言最初是用英语设计的,并假设使用的是常见的英语字符集,其中包括诸如 {}[] 等字符。然而,一些其他语言并没有这些或其他 C 所需要的字符。为了解决这个问题,1989 年的 C 标准在第 5.2.1.1 节定义了一组三重符号序列(trigraph sequences),它们可以替代这些符号,并在任何情况下都有效。实际上,1989 年的 C 标准(第 5.1.1.2 节)规定,编译的第一个翻译阶段就是将三重符号序列替换为它们相应的单字符等效符号。需要注意的是,C23 标准发布后,三重符号将在 C 语言中被移除。

以下是存在的三重符号序列,没有其他的。每个不以列出的一组三重符号序列开始的问号(?)不会被改变。

序列 替换为
??= #
??( [
??/ \
??) ]
??' ^
??< {
??! `
?> }
??- ~

这意味着像下面这样的语句:

printf ("Eh???/n");

在三重符号被替换后,相当于:

printf ("Eh?\n");

如果程序员希望在字符串和字符常量(这是唯一需要替换三重符号并且会改变内容的地方)中不进行三重符号的替换,程序员可以简单地转义第二个问号,例如:

printf ("Two question marks in a row: ?\?!\n");

双重符号(Digraphs)

1999 年的 C 标准在第 6.4.6 节中新增了这些符号,通常被称为双重符号(digraphs)。它们与以下标记等价,除了拼写不同:

双重符号 等效符号
<: [
:> ]
<% {
%> }
%: #
%:%: ##

换句话说,它们在作为宏替换的一部分时在字符串化时行为不同,但在其他情况下是等价的。

参考文献

最后修改: 2025年01月12日 星期日 13:33