【问题标题】:Print ?? and !! in different sequence will show different output打印 ??和 !!在不同的顺序将显示不同的输出
【发布时间】:2010-10-05 10:05:55
【问题描述】:

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

代码:

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

输出:

即使代码在 MBCS 和 UNICODE 下编译也会发生。

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

有什么想法吗?

【问题讨论】:

  • 解释如下:要克服只需转义一个问号。
  • 三元组最好的部分是,如果你不知道它们叫什么,就不可能搜索到它们。 :-)(当被问及“??”时,Google 并没有太大帮助)
  • @JamesMcNellis 搜索“??!” SymbolHound 把我带到这里 :)

标签: c trigraphs


【解决方案1】:

??! 是一个 trigraph,被 | 替换。

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

【讨论】:

  • 或其他任何地方,就此而言。 :)
  • @jalf:我希望 ANSI C 委员会遵守你的规则... ;-)
  • 我主要只是希望每个提问的人都关注它;)
【解决方案2】:

你可以试试

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

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

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

【讨论】:

    【解决方案3】:

    他们被称为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: |");
    

    【讨论】:

    • 所有这些示例都在字符串中,但应该注意的是,三元组替换发生在无处不在,而不仅仅是在字符串中。
    【解决方案4】:

    ??!被称为 trigraph 并替换为 |在输出中。检查这个link

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • ...如今,它们的实现只是为了让编程更有趣。 :)
      • @Matteo:是的。编程毫无意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 2020-08-29
      • 1970-01-01
      相关资源
      最近更新 更多