如前所述??!??!
实际上是两个三合(??!
和??!
再次)捣成泥在一起会被替换,翻译成||
,即逻辑或,由预处理器。
下表包含每个三字组合应有助于消除其他三字组合的歧义:
Trigraph Replaces
??( [
??) ]
??< {
??> }
??/ \
??' ^
??= #
??! |
??- ~
来源:C:第5版参考手册
因此,看起来像三叉戟的三叉戟??(??)
最终将映射到[]
,??(??)??(??)
将被替换[][]
,依此类推,您便明白了。
由于在预处理过程中替换了三字母组合,您可以使用cpp
一个愚蠢的trigr.c
程序来自己查看输出视图:
void main(){ const char *s = "??!??!"; }
并使用:
cpp -trigraphs trigr.c
您将获得控制台输出
void main(){ const char *s = "||"; }
如您所见,-trigraphs
必须指定该选项,否则cpp
将发出警告。这说明立体字是怎样的过去了,除了使可能碰到的人迷惑之外,没有现代价值。
至于引入三字母组合的基本原理,在查看ISO / IEC 646的历史记录部分时会更好地理解:
ISO / IEC 646及其前身ASCII(ANSI X3.4)在很大程度上认可了电信行业中有关字符编码的现有做法。
由于ASCII没有提供英语以外的语言所需的许多字符,因此产生了许多国家变体,用一些需要的字符代替了一些较少使用的字符。
(强调我的)
因此,从本质上讲,某些国家变体中替换了一些需要的字符(存在三字母组合的字符)。这导致使用由其他变体仍然具有的字符组成的三字母组合的替代表示。
!ErrorHasOccurred() ??!???! HandleError();
如何编译?那是??!
???
!
。证明这一点?