C 源程序的源字符集被包含在 7 位的 ASCII 字符集中,但是它是 ISO 646-1983 Invariant Code Set 的超级。三字母词序列允许编写只使用 ISO(International Standards Organization)Invariant Code Set 的 C 程序。三字母词就是三个字符(由两个连续的问号而被引入)的序列,并且编译器会把它们替换成相应的标点字符。你可以用一种没有为部分标点字符包含方便的图形呈现的字符集而在 C 源文件中使用三字母词。
下表说明了九种三字母词序列。所有在源文件出现的第一列中的标点字符都会被替换成第二列中的相应字符。
三字母词序列
三字母词 | 标点字符 |
---|
??= | # |
??( | [ |
??/ | \ |
??) | ] |
??' | ^ |
??< | { |
??! | | |
??> | } |
??- | ~ |
三字母词始终被视为一种单独的源字符。三字母词的翻译过程首先会获取第一翻译阶段的位置,并且在字符串的字面认可与字符变量的转码字符之前。因此,只有上表中所说的这九种三字母符才是被认可的。而所有其他的字符序列都不会被翻译。
字符转码序列 \? 防止了类似于三字母字符序列的误译。(关于转码字符序列的信息,参考[转码序列]。)例如,如果你尝试用这样的 printf 语句来打印字符串 What??!
printf( "What??!\n" );
那么这个字符串会被打印成 What|,因为 ??! 是一种三字母词序列,并且会被替换成字符串 |。只有编写下列语句才能够正确地打印这个字符串:
printf( "What?\?!\n" );
在这个 printf 语句中,第二个问号前面的一个反斜线转码字符防止了把 ??! 误译成一个三字母词。