C++ C+中三角图序列的用途+;?
根据C++'03标准2.3/1: 在进行任何其他处理之前,以下三个字符的序列(“trigraph序列”)中的每一个出现都会被表1中所示的单个字符替换C++ C+中三角图序列的用途+;?,c++,c++03,trigraphs,C++,C++03,Trigraphs,根据C++'03标准2.3/1: 在进行任何其他处理之前,以下三个字符的序列(“trigraph序列”)中的每一个出现都会被表1中所示的单个字符替换 ---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------
----------------------------------------------------------------------------
| trigraph | replacement | trigraph | replacement | trigraph | replacement |
----------------------------------------------------------------------------
| ??= | # | ??( | [ | ??< | { |
| ??/ | \ | ??) | ] | ??> | } |
| ??’ | ˆ | ??! | | | ??- | ˜ |
----------------------------------------------------------------------------
----------------------------------------------------------------------------
|三角图|替换|三角图|替换|三角图|替换|
----------------------------------------------------------------------------
| ??= | # | ??( | [ | ??< | { |
| ??/ | \ | ??) | ] | ??> | } |
| ??’ | ˆ | ??! | | | ??- | ˜ |
----------------------------------------------------------------------------
在现实生活中,这意味着代码printf(“什么??!\n”)代码>将导致打印什么|
,因为
是一个三角图序列,用|
字符替换
我的问题是使用三角图的目的是什么?使用三角图有什么实际优势吗
UPD:在回答中提到,一些欧洲键盘没有所有标点符号,因此非美国程序员必须在日常生活中使用三角图
UPD2:Visual Studio 2010默认情况下关闭了trigraph支持。它们用于缺少C++基本字符集中某些字符的系统。不用说,这种系统极为罕见。< P> >代码> C++编程语言< /C>特别版,第829页< /P>
ASCII特殊字符[
,]
,{
,}
,
和\
占据ISO指定为字母的字符集位置。在大多数欧洲国家ISO-646字符集中,这些位置由英文字母表中找不到的字母占据
提供了一组三角图,以允许使用真正标准的最小字符集以可移植的方式表达国家字符。这对于程序的交换很有用,但并不能使人们更容易阅读程序。当然,这个问题的长期解决方案是C++程序员得到支持他们的母语和C++的设备。不幸的是,这对一些人来说似乎是不可行的,而引进新设备可能是一个令人沮丧的缓慢过程
一些欧洲键盘没有(没有?)像美国键盘那样拥有所有的标点符号,因为它们需要特殊字母字符的键。例如,瑞典键盘上的A形圈就是花括号所在的位置
为了适应这些用户,三角图是一种仅使用最常见的ASCII字符输入标点符号的方法。三角图的出现主要是出于历史原因。如今,大多数语言的大多数现代键盘都允许访问所有这些字符,但这曾经是一些欧洲键盘的一个问题。这就是三角图被发明的原因
如果你不知道它们的用途,你就不应该使用它们
不过,意识到它们仍然很好,因为您可能会在代码中意外或无意地使用它们 有答案
归根结底,ISO 646字符集并没有C语法的所有字符,因此有些带有键盘和显示器的系统无法处理这些字符(尽管我认为现在这些字符非常罕见)
一般来说,您不需要使用它们,但是您需要确切地了解您遇到的问题。三角图是“?
”字符具有转义序列的原因:
'\?'
因此,有几种方法可以避免示例问题:
printf( "What?\?!\n" );
printf( "What?" "?!\n" );
但是你必须记住,当你输入两个“?”字符时,你可能会开始一个三角图(当然我从来没有想过这件事)
实际上,在日常生活中,我根本不担心三角图和有向图。但是你应该意识到它们,因为每隔几年你就会遇到一个与它们相关的bug(你会花一整天的时间诅咒它们的存在)。如果编译器可以配置为在遇到三元图或有向图时发出警告(或错误),这样我就可以知道我有什么事情需要处理
为了完整性,有向图的危险性要小得多,因为它们被当作标记处理,所以字符串文本中的有向图不会被解释为有向图
要了解C/C++程序中标点符号的各种乐趣(包括一个会让我毛骨悚然的trigraph bug),请参阅
增编:
默认情况下,GCC似乎不会处理(并警告)三角图。其他一些编译器有关闭trigraph支持的选项(例如IBM的)。Microsoft在VS2008中开始支持必须显式启用的警告(C4837)(使用-Wall或其他东西)。主要是因为C标准早在1989年就引入了警告(C4837),当时在某些机器上存在trigraphs映射到的字符存在问题。在1998发布C++标准时,对三叉树的需求并不很大。它们是C上的一个疣;它们就像C++上的一个疣。对它们的需求——特别是在英语世界之外——这就是为什么它们被添加到C中的原因。我看到在90年代早期使用Trigraph来帮助将大型机中的PL/1程序转换为在PC上运行/编译/调试
他们正在使用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