根据 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(使用前将#替换为@)