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

         在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”,然后编译运行即可。  两种方法的参考截图如下:

方法①

方法②

DEV-C  支持ANSI-C标准1DEV-C  支持ANSI-C标准2

 

  

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

          

 

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值