5

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

代码:

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

输出: 替代文字

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

输出随“?”的顺序而变化 和 ”!”...

任何想法?

4

5 回答 5

16

??!是一个被 替换的三元组|

通常,您不应该将两个问号字符放在源文件中的任何位置。

于 2010-10-05T10:07:35.950 回答
5

你可以试试

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

在计算机编程中,二合字母和三合字母分别是两个和三个字符的序列,它们被编程语言解释为一个字符。

一些编译器支持关闭三元组识别的选项,或默认禁用三元组并需要一个选项来打开它们。有些人在源文件中遇到三元组时会发出警告。Borland 提供了一个单独的程序,即三字预处理器,仅在需要处理三字时使用。

于 2010-10-06T05:28:45.913 回答
5

它们被称为三字母序列

??!是 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: |");
于 2010-10-05T10:08:33.987 回答
4

这 ??!被称为 trigraph 并替换为 | 在输出中。检查此链接

于 2010-10-05T10:10:09.727 回答
2

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

于 2010-10-05T10:11:12.577 回答