跳轉到內容

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
======= ==========
   <:       [
   :>       ]
   <%       {
   %>       }
   %:       #
  %:%:      ##

換句話說,當在宏替換中被字串化時,它們的行為會有所不同,但在其他方面是等效的。

參考資料

[編輯 | 編輯原始碼]
華夏公益教科書