0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中的“三字母词”是什么

Q4MP_gh_c472c21 来源:CSDN 作者:CSDN 2021-09-26 14:46 次阅读

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

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

责任编辑:haq

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

    关注

    180

    文章

    7528

    浏览量

    128434
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66746

原文标题:C语言中的“三字母词”坑了工程师

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    c语言中逻辑真等价于什么

    在C语言中,逻辑真等价于1。逻辑真可以理解为一个表达式、语句或条件的结果为真,即满足条件。在计算机科学和编程中,逻辑真在控制流语句、循环和条件语句中具有重要的作用。 逻辑真等价于条件为真的情况
    的头像 发表于 11-30 14:10 777次阅读

    C语言字母转化为ASCII码值

    C语言是一种非常强大和广泛使用的编程语言,它具有丰富的功能和灵活性,可以用于各种不同的应用程序。其中一个常见的用途是将字母转化为ASCII码值。在本文中,我将详细介绍如何在C语言中实现
    的头像 发表于 11-26 10:31 3223次阅读

    c语言将小写字母转换成大写字母

    在C语言中,字符的大小写转换是常见的操作,而具体实现该功能的方法有多种,本篇文章将详尽、详实、细致地介绍C语言中将小写字母转换成大写字母的几种常用方法。具体包括使用ASCII码、使用位
    的头像 发表于 11-26 10:30 4679次阅读

    C语言中链表的作用是什么?

    C语言中指针用的很少,链表、文件操作几乎没用过,所以也不能理解到底有什么作用。各位有经常在做程序时会用到这些吗。
    发表于 11-06 06:23

    C语言中数字怎么转成指针?

    C语言中数字怎么转成指针,比如我要去内存地址为0x100的内容,用一句话表达,不如uchar a=?我要问号等于0x100地址的内容
    发表于 10-31 06:29

    C语言中ASCII代码是什么意思?

    C语言中ASCII代码是什么意思常见的ASCII代码都需要记吗
    发表于 10-25 07:10

    请问链表在单片机C语言中有应用吗?

    链表在单片机C语言中有应用么?
    发表于 10-16 07:28

    C语言中怎么定义一个不定长度的数组?

    C语言中怎么定义一个不定长度的数组
    发表于 10-09 07:40

    M0518用串口接收数据时,第一个字节是正常的,为什么后面的第二、三字节却是乱的?

    M0518用串口接收数据时出问题。发送端共发送3个字节,固定第一节数据会改变,其它两个字节的数据一直为0,可是接收端收到的数据,第一个字节是正常的,后面的第二、三字节却是乱的。本应为0的,但是像
    发表于 08-21 07:13

    C语言中赋值运算符详解

    在C语言中,赋值运算符用于将一个值赋给变量。
    发表于 08-18 16:38 1028次阅读
    C<b class='flag-5'>语言中</b>赋值运算符详解

    C语言中for循环的用法和应用 C语言中for循环与while循环的区别

    C语言中的循环结构时,for循环是最常用的一种。它允许重复执行一段代码,直到满足特定条件为止。
    发表于 08-18 16:33 1033次阅读
    C<b class='flag-5'>语言中</b>for循环的用法和应用 C<b class='flag-5'>语言中</b>for循环与while循环的区别

    C语言中宏定义的应用

    在C语言中,宏定义是一种预处理指令,用于在代码中定义和使用常量、函数或代码片段的替代。
    发表于 08-17 15:33 387次阅读

    C语言中函数的基本知识

    函数是C语言中的基本构建块之一,它允许我们将代码组织成可重用、模块化的单元。
    发表于 08-16 18:25 380次阅读

    c语言中并没有变量zero的定义是怎么回事?

    \".insn r 0x7b,2,1,x0,%1,x0\" :\"=r\"(zero) :\"r\"(addr) 这是在就是示例c语言中
    发表于 08-16 07:58

    Go语言中的整数类型

    在 Go 语言中,整型可以细分成两个种类十个类型。
    发表于 07-20 15:25 336次阅读