zoukankan      html  css  js  c++  java
  • C语言中的“三字母词”坑了工程师!什么是“三字母词”?

    某软件工程师接盘了前同事的项目,进度一拖再拖,最后发现问题出现在如下代码:

    // 注释语句 ??/
    
    2a = 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编译器不处理“三字母词”,会将它们当做普通的字符串来处理。

    ————————————————

    - End -

    不管你是转行也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~+

    【值得关注】我的 编程学习交流俱乐部 !【点击进入

    C语言入门资料(网盘链接免费分享):


    C语言推荐书籍(PDF免费分享):


     
  • 相关阅读:
    CentOS 7/8修改系统运行级别
    Sketchup 汇总
    [转]Ruby之类的真相
    [转]Ruby之代码块的迷思
    [转]ruby中的异常处理
    [转]ruby中Class的allocate
    [转]ruby中require和load的区别
    [转]ruby之方法查找
    [转]ruby之动态方法
    [转] ruby之对象体系
  • 原文地址:https://www.cnblogs.com/huya-edu/p/15364147.html
Copyright © 2011-2022 走看看