打印?和!!以不同的顺序将显示不同的输出

时间:2010-10-05 10:05:55

标签: c trigraphs

当我以非常简单的方式编写以下行时,我发现了一个奇怪的输出:

代码:

 printf("LOL??!\n");
 printf("LOL!!?\n");

输出: alt text

即使代码是在MBCS和UNICODE下编译的,也会发生这种情况。

输出因“?”的顺序而异。和“!”......

有什么想法吗?

5 个答案:

答案 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)

字符串常量中的特殊字符序列具有特殊含义。它们最初被称为三字母,因为并非所有终端都支持某些字符。