跳转到内容

C 编程/C 三字符组

来自维基教科书,开放的书籍,开放的世界

三字符组

[编辑 | 编辑源代码]

C 语言的设计基于英语,并假设使用常见的英语字符集,其中包括 `{`、`}`、`[`、`]` 等字符。然而,一些其他语言并不包含这些字符或其他 C 语言所需的字符。为了解决这个问题,1989 年的 C 标准在第 5.2.1.1 节中定义了一组**三字符组序列**,它们可以作为这些符号的替代品,并且可以在任何情况下工作。事实上,1989 年 C 标准 (第 5.1.1.2 节) 中指定的编译的第一个翻译阶段就是用它们对应的单个字符等价物来替换三字符组序列。请注意,三字符组将在 C 的下一个主要标准 C23 发布后被移除。[1]

以下三字符组序列存在,并且没有其他序列。任何不以这些列出的三字符组序列开头的问号 `?` 不会改变。

Sequence Replacement
======== ===========
  ??=         #
  ??(         [
  ??/         \
  ??)         ]
  ??'         ^
  ??<         {
  ??!         |
  ??>         }
  ??-         ~

这样做的效果是,诸如

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

之类的语句将在替换三字符组后等效于

printf ("Eh?\n");

如果程序员想要三字符组 *不被* 替换,在字符串和字符常量中 (这是它们唯一需要替换的地方,并且会改变结果),程序员可以简单地转义第二个问号;例如

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

1999 年的 C 标准在第 6.4.6 节中添加了这些标点符号,有时称为 *二字符组*。它们等效于以下标记,但拼写不同

Digraph Equivalent
======= ==========
   <:       [
   :>       ]
   <%       {
   %>       }
   %:       #
  %:%:      ##

换句话说,当在宏替换中被字符串化时,它们的行为会有所不同,但在其他方面是等效的。

参考资料

[编辑 | 编辑源代码]
华夏公益教科书