代码之家  ›  专栏  ›  技术社区  ›  Kirill V. Lyadvinsky

C++中的三重奏序列的目的

  •  115
  • Kirill V. Lyadvinsky  · 技术社区  · 15 年前

    根据C++'03标准2.3/1:

    在进行任何其他处理之前,以下三个字符序列(trigraph序列)中的每一个出现都会被表1中所示的单个字符替换。

    ----------------------------------------------------------------------------
    | trigraph | replacement | trigraph | replacement | trigraph | replacement |
    ----------------------------------------------------------------------------
    | ??=      | #           | ??(      | [           | ??<      | {           |
    | ??/      | \           | ??)      | ]           | ??>      | }           |
    | ??’      | ˆ           | ??!      | |           | ??-      | ˜           |
    ----------------------------------------------------------------------------
    

    在现实生活中,这意味着代码 printf( "What??!\n" ); 将导致打印 What| 因为 ??! 是被替换为的trigraph序列 |

    我的问题是使用三角图的目的是什么? 使用三角图有什么实际优势吗?

    UPD :在回答中提到,一些欧洲键盘没有所有的标点符号,所以非美国程序员必须在日常生活中使用三角图?

    :Visual Studio 2010默认情况下已关闭trigraph支持。

    9 回复  |  直到 8 年前
        1
  •  101
  •   Community paulsm4    7 年前

    This question (about the closely related digraphs) 答案是肯定的。

    ? '字符具有转义序列:

    '\?'
    

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

    但是你必须记住,当你输入两个“?”字符时,你可能会开始一个三角图(当然我从来没有想过这件事)。

    实际上,在日常生活中,我根本不担心三角图和有向图。但是你应该意识到它们,因为每隔几年你就会遇到一个与它们相关的bug(你会花一整天的时间诅咒它们的存在)。如果编译器可以配置为在遇到三元图或有向图时发出警告(或错误),这样我就可以知道我有什么事情需要处理。

    为了完整性,有向图的危险性要小得多,因为它们被当作标记处理,所以字符串文本中的有向图不会被解释为有向图。

    要了解C/C++程序中标点符号的各种乐趣(包括一个会让我毛骨悚然的trigraph bug),请看 Herb Sutter's GOTW #86 article


    增编:

    默认情况下,GCC似乎不会处理(并警告)三角图。其他一些编译器有关闭trigraph支持的选项(例如IBM的)。Microsoft开始支持VS2008中的警告(C4837),该警告必须显式启用(使用-Wall或其他方式)。

        2
  •  26
  •   L. F.    5 年前

    是的,国外设备,如IBM 3270终端。如果我记得的话,3270没有卷发背带!如果您想在IBM小型/大型机上编写C,您可以 不得不 对每个块边界使用可怜的三角图。幸运的是,我只需要用C语言编写软件就可以了 一些IBM小型计算机设施,实际上并没有编写C软件 系统/36。

    查看“P”键旁边的内容:

    keyboard

    嗯,很难说。“回车”旁边有一个额外的按钮,我可能会把它倒过来:可能是“[”/“]”对丢失了。无论如何,如果你不得不写C,这个键盘会让你感到悲伤。

    此外,这些终端显示EBCDIC,IBM的“本机”大型机字符集,而不是ASCII(感谢Pavel Minaev的提醒)。

        3
  •  22
  •   Rob    15 年前

    从…起 The C++ Programming Language

    [ , ] , { , } , | ,及 \

        4
  •  15
  •   CB Bailey    15 年前

    它们用于缺少C++基本字符集中某些字符的系统。不用说,这样的系统极其罕见。

        5
  •  9
  •   Pavel Minaev    15 年前

    在C++0x中,有人建议删除三角图。也就是说,支持它们的观点似乎仍然有很强的论据——参见C++委员会文件。 N2910 它讨论了这一点。显然,EBCDIC是需要它们的一个主要据点。

        6
  •  5
  •   Kelly S. French    12 年前

    他们正在使用PL/I-to-C编译器在PC机上编辑PL/I,他们希望在移回不支持花括号的大型机时代码能够正常工作。我建议他们可以使用宏,比如

    #def BEGIN {    
    #def END }  
    

    #def BEGIN ??<
    #def END ??>
    

    如果他们真的想变得花哨,他们可以试试

    #ifdef MAINFRAME
        #def BEGIN ??<
        #def END ??>
    #else
        #def BEGIN {    
        #def END }  
    #endif
    

    然后程序看起来就像是用Pascal编写的。他们只是滑稽地看着我,一整天都不和我说话。我想我不会责怪他们

        7
  •  3
  •   Jonathan Leffler    15 年前

        8
  •  3
  •   user176581 Ned Batchelder    11 年前

    一些欧洲键盘没有(没有?)像美国键盘那样拥有所有的标点符号,因为它们需要特殊字母字符的键。例如,瑞典键盘上的A形圈就是花括号所在的位置。

        9
  •  2
  •   sbi    9 年前

    他们在那里主要是出于历史原因。如今,大多数语言的大多数现代键盘都允许访问所有这些字符,但这曾经是一些欧洲键盘的一个问题。这就是三角图被发明的原因。

    如果你不知道它们的用途,你就不应该使用它们。