当我以非常简单的方式编写以下行时,我发现了一个奇怪的输出:
代码:
printf("LOL??!\n");
printf("LOL!!?\n");
输出:
即使代码是在 MBCS 和 UNICODE 下编译的,也会发生这种情况。
输出随“?”的顺序而变化 和 ”!”...
任何想法?
??!
是一个被 替换的三元组|
。
通常,您不应该将两个问号字符放在源文件中的任何位置。
你可以试试
printf( "What?\?!\n" );
在计算机编程中,二合字母和三合字母分别是两个和三个字符的序列,它们被编程语言解释为一个字符。
一些编译器支持关闭三元组识别的选项,或默认禁用三元组并需要一个选项来打开它们。有些人在源文件中遇到三元组时会发出警告。Borland 提供了一个单独的程序,即三字预处理器,仅在需要处理三字时使用。
它们被称为三字母序列
??!
是 Vertical Bar 的三元组序列|
。
C/C++ 预处理器识别三元组并用它们的等效字符替换它们。
因此,当编译器看到您的代码时,三元组已经被替换了。
# grepping in the source file:
$ grep printf a.c
printf("foo: ??!");
# grepping the preprocessor output:
$ gcc a.c -trigraphs -E | grep printf | grep foo
printf("foo: |");
这 ??!被称为 trigraph 并替换为 | 在输出中。检查此链接
它是字符串常量中具有特殊含义的特殊字符序列。它们最初被称为三合符,因为并非所有终端都支持某些字符。