当我以非常简单的方式编写以下行时,我发现了一个奇怪的输出:
代码:
printf("LOL??!\n");
printf("LOL!!?\n");
输出:
即使代码是在MBCS和UNICODE下编译的,也会发生这种情况。
输出因“?”的顺序而异。和“!”......
有什么想法吗?
答案 0 :(得分:16)
??!
是由|
替换的trigraph。
通常,您不应在源文件中的任何位置放置两个问号字符。
答案 1 :(得分:5)
他们被称为Trigraph Sequences
??!
是垂直条|
的三字符序列。
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: |");
答案 2 :(得分:5)
您可以尝试
printf( "What?\?!\n" );
在计算机编程中,有向图和三字图分别是两个和三个字符的序列,它们被编程语言解释为一个字符。
某些编译器支持关闭三元组识别的选项,或默认禁用三元组,并需要一个选项才能打开它们。有些人在源文件中遇到三字符时会发出警告。 Borland提供了一个单独的程序,即三线程预处理器,仅在需要进行三元组处理时使用。
答案 3 :(得分:4)
??!被称为trigraph并被|替换在输出中。请检查此link
答案 4 :(得分:2)
字符串常量中的特殊字符序列具有特殊含义。它们最初被称为三字母,因为并非所有终端都支持某些字符。