什么是“三字母词”

描述

    某工程师接盘了前同事的项目,进度一拖再拖。    最后发现问题出现在如下代码:
  •  
// 注释语句 ??/a = b+c;

    请注意代码中的“??/”,就是这注释隐藏的很深,让项目一拖再拖。

    "??/"会被编译器当作 /,变成C语言的换行符(多行代码连接符)。

    于是这段代码等同于// 注释语句 a = b+c ;就会被注释掉。

    下面我们就是说说“??/”这种“三字母词”的内容。

什么是“三字母词”

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

    也许是由于这些字符集我们基本上用不到,所以在大多数C语言的书籍中,我们都看不到对“三字母词”的讲解。这里资料来源于参考ANSI C99标准(即传说中的《American National Standards Institute for Programming Languages-C》 1999年,我们习惯简称为“C99”)    “三字母词”主要有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语言编译器不处理“三字母词”,会将它们当做普通的字符串来处理。

审核编辑 :李倩


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分