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

    文章

    7605

    浏览量

    136993
  • 代码
    +关注

    关注

    30

    文章

    4791

    浏览量

    68685

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

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

收藏 人收藏

    评论

    相关推荐

    C语言中申请的堆内存能不能自动释放

    C语言中申请的堆内存能不能自动释放?每次都要手动 free 太麻烦,也容易忘记。 学过 C++ 的同学,应该首先能想到智能指针。 但是这是C语言
    的头像 发表于 11-27 09:33 123次阅读

    C语言关键分别发生在哪个阶段

    在编译的第一个阶段:预处理,对一些宏定义做替换。 第二个,const。 C语言中的 const 用于修饰只读变量,表示变量本身不能修改。 这个关键会在编译的第二步起作用,也就是编译。强行修改一个只读变量,编译就会提示问题。 第
    的头像 发表于 11-24 10:31 191次阅读

    C语言中的socket编程基础

    Socket编程简介 Socket是一种通信机制,允许程序之间进行通信。在C语言中,socket编程是网络编程的基础。通过使用socket,程序可以发送和接收数据,实现不同计算机之间的通信
    的头像 发表于 11-01 16:51 344次阅读

    C语言关键--typedef

    C语言关键使用方法学习指南!
    的头像 发表于 10-07 12:44 274次阅读

    c语言中从左到右结合怎么看

    C语言中,操作符的结合性(Associativity)是指当操作符在表达式中连续出现时,它们如何与操作数结合的顺序。对于大多数二元操作符(即需要两个操作数的操作符),C语言遵循两种基
    的头像 发表于 08-20 11:42 911次阅读

    快速掌握C语言关键

    C语言中的32个关键你知道多少个呢?根据关键的作用分为四类:数据类型关键、控制语句关键
    的头像 发表于 07-06 08:04 358次阅读
    快速掌握<b class='flag-5'>C</b><b class='flag-5'>语言</b>关键<b class='flag-5'>字</b>

    一文了解场效应极管型号规则及参数含义

    场效应极管管现行有两种命名方法。第一种命名方法,型号的第字母J代表结型场效应管,O代表绝缘栅场效应管。第二位字母代表材料,D是P型硅,反型层是N沟道;
    的头像 发表于 04-23 10:40 2087次阅读
    一文了解场效应<b class='flag-5'>三</b>极管型号规则及参数含义

    嵌入式系统中C语言结构体的基础实现与应用

    C语言中的数组只能允许程序员定义存储相同类型数据。但是结构是C语言编程中允许您存储不同数据类型的数据。
    发表于 03-12 14:29 509次阅读
    嵌入式系统中<b class='flag-5'>C</b><b class='flag-5'>语言</b>结构体的基础实现与应用

    C语言中的typedef的应用

    C 语言提供了 typedef 关键,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE。
    发表于 03-06 11:34 389次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的typedef的应用

    C语言#define的应用

    C/C++ 编程语言中,当程序被编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成编译并执行该程序。预处理器也称为宏预处理器。
    发表于 03-06 11:29 386次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>#define的应用

    介绍C语言中错误处理和异常处理的一些常用的方法和策略

    C语言是一种低级的、静态的、结构化的编程语言,它没有提供像C++或Java等高级语言中的异常处理机制,例如try-catch-finally
    的头像 发表于 02-28 14:25 639次阅读

    C语言中的可变参数介绍

    C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数
    发表于 02-28 14:00 322次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的可变参数介绍

    vb语言c++语言的区别

    Microsoft开发的一种面向对象的事件驱动编程语言。它的设计目标是简化编程过程,让初学者也能快速上手。与之相比,C++语言是一种通用的、面向对象的编程语言,其设计目标是提供高性能的
    的头像 发表于 02-01 10:20 2364次阅读

    枚举有多大?c语言枚举end的作用是什么?

    枚举有多大?c语言枚举end的作用是什么? 枚举在C语言中是一种常见的数据类型,用于定义一组相互关联的常量或者变量。它通常用于表示一系列可能的取值,使得程序更加易读和易维护。在
    的头像 发表于 01-19 14:19 613次阅读

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析  在C语言中,访问权限冲突异常通
    的头像 发表于 01-12 16:03 5806次阅读