C++ 中三字母序列的用途?

2023-11-26

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

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

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

在现实生活中这意味着代码printf( "What??!\n" );将导致打印What|因为??!是一个三字母序列,被替换为|特点。

我的问题是使用三字母组的目的是什么?使用三字母表有什么实际好处吗?

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

UPD2:Visual Studio 2010 默认情况下关闭三字母支持。


这个问题(关于密切相关的有向图)有答案了。

归根结底,ISO 646 字符集并不包含 C 语法的所有字符,因此有些系统的键盘和显示器无法处理这些字符(尽管我认为这些是相当罕见的)如今)。

一般来说,您不需要使用它们,但您需要了解它们以解决您遇到的问题。三字母组合是 '?' 字符有一个转义序列:

'\?'

因此,可以通过以下几种方法来避免示例问题:

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

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

但你必须记住什么时候输入两个“?”你可能会开始一个三字母组的字符(这当然不是我正在考虑的事情)。

在实践中,三字母和二字母是我日常根本不用担心的事情。但你应该意识到它们,因为每隔几年你就会遇到与它们相关的错误(并且你会花一天的剩余时间诅咒它们的存在)。如果编译器可以配置为在遇到三字母或二字母时发出警告(或错误),那就太好了,这样我就可以知道我有一些我应该有意识地处理的东西。

为了完整起见,二合字母的危险性要小得多,因为它们被作为标记进行处理,因此字符串文字内的二合字母不会被解释为二合字母。

要获得关于 C/C++ 程序中标点符号的各种乐趣的良好教育(包括肯定会让我抓狂的三字母错误),请看一下Herb Sutter 的 GOTW #86 文章.


附录:

默认情况下,GCC 似乎不会处理(并且会警告)三字母组。其他一些编译器可以选择关闭三字符组支持(例如 IBM 的)。 Microsoft 开始在 VS2008 中支持必须显式启用的警告 (C4837)(使用 -Wall 或其他东西)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中三字母序列的用途? 的相关文章

随机推荐