C语言中鲜为人知的“三字母词” (trigraph sequences)

Technorati 标签: C语言, 三字母词, trigraph sequences, 三联符序列, C99, ANSI C

         在ANSI标准中,定义了“三字母词”,或者成为“三联符序列”,英文为"trigraph sequences"。目的主要是为了在一些特定的字符集中,比如一些七位代码集中,解决一些特定字符的输入问题。

         也许是由于这些字符集我们基本上用不到,所以在大多数C语言的书籍中,我们都看不到对“三字母词”的讲解。这里资料来源于参考ANSI C99标准(即传说中的《American National Standards Institute for Programming Languages-C》 1999年,我们习惯简称为“C99”)。

        截止到现在,“三字母词”有且仅有9个,分别为:

三字母词 对应的字符
??= #
??( [
??) ]
??< {
??> }
??/ /
??! |
??' ^
??- ~

       就这9个,没有其他的三字母词。源代码中的“三字母词”,在编译阶段会被替换为“对应的字符”。对于以“?”开头的字符序列,如果不能与上面9个匹配,编译器将保持原状;一旦匹配,编译器就会做替换。

       例子1——C99标准中给出的例子:

printf("Eh???/n");

相当于

printf("Eh/n");

       例子2——一个我们容易犯的错误(摘自《Pointers On C》):

printf("Delete file (are you really sure??):");

运行结果为(三字母词“??)”编译时替换为“]”):

Delete file (are you really sure]: 

而不是我们想象中的:

Delete file (are you really sure??): 

 

       注意:由于编译器的种类各样,对ANSI C的支持也不一样,所以可能会有些C编译器不处理“三字母词”,会将它们当做普通的字符串来处理。

       我的测试环境为:Windows 7, DEC C++(带mingw版),即编译环境mingw下的gcc。这个编译器默认就是不识别“三字符词”,如果希望让其识别,就需要让gcc支持标准,需要在编译的时候添加选择"-ansi"或者"-trigraphs"。手动编译时在命令行中大家都会用;在DEV C++图形界面中,两种方法:在“工具”—>“编译选项”中,在“编译器”选项卡下,在“编译时加入以下命令”输入框中输入"-ansi"或者输入"-trigraphs",并且勾选该选项,这样编译运行的结果就会识别三字母词;在“工具”—>“编译选项”中,在“代码生成/优化”选项卡下,左侧选中“C编译器”,右侧将“支持所有ANSI C标准”修改成“Yes”,然后编译运行即可。  两种方法的参考截图如下:

方法①

方法②

C语言中鲜为人知的“三字母词” (trigraph sequences)_第1张图片 C语言中鲜为人知的“三字母词” (trigraph sequences)_第2张图片

 

  

 本文链接:http://blog.csdn.net/daheiantian/archive/2010/12/17/6095507.aspx

          

 

你可能感兴趣的:(语言,c,编译器,standards,delete,pointers,C)