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语言
    +关注

    关注

    183

    文章

    7650

    浏览量

    146517
  • 代码
    +关注

    关注

    30

    文章

    4985

    浏览量

    74590

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    c语言中的代码优化

    放在寄存器中,但最终该变量可能由于条件不知足并未成为寄存器变量,而是被放在了存储器中,但编译器中并不报错(在C++语言中有另外一个\"建议\"型关键:inline)。   下面
    发表于 01-12 09:45

    C语言主要特点

    C语言的主要特点有: 1.语言简洁、紧凑,使用方便、灵活 。C语言一共只有32个关键、9种控制
    发表于 01-05 07:41

    C语言中实现函数宏的种方式

    , var_b = %dn\", var_a, var_b); // var_a = 2, var_b = 1 return 0; } C 语言规定,do{...}while(0) 语法必须
    发表于 12-29 07:34

    请问C语言中整形溢出的解决方法有哪些?

    C语言中整形溢出的解决方法有哪些?
    发表于 12-29 07:33

    单片机c语言中定义字节怎么定义?

    定义位可以用***it但是定义字节呢?还有就是比如汇编中的DPTR的DPH和DPL在c语言中怎样定义的呢?
    发表于 12-29 06:32

    请问C语言中整形溢出会产生哪些异常行为?

    C语言中整形溢出会产生哪些异常行为?
    发表于 12-26 07:05

    请问C语言中整形溢出对哪些应用场景影响较大?

    C语言中整形溢出对哪些应用场景影响较大
    发表于 12-24 08:24

    C语言C++的区别及联系

    缺点:性能比面向过程低。 二、具体语言上的区别 1、关键的不同 C语言有32个关键C
    发表于 12-24 07:23

    Typedef在C语言中的应用

    Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义。也可以用预处理器做类似的事。例如,思考一下下面的例子: #define dPS struct s * typedef
    发表于 12-22 13:53

    C语言中可以嵌套汇编语言吗?

    请问C语言中可以嵌套汇编语言吗?
    发表于 12-15 08:14

    C语言的编程技巧

    一个成员是一个未知大小的数组,适用于动态分配内存并关联一个可变长度的数组。‌ ‌3、匿名结构体和联合体‌:C语言允许在结构体或联合体中定义不带标签的内部结构体或联合体,简化代码结构。 ‌4
    发表于 11-27 06:46

    C语言的分支结构介绍

    1.简单if语句 C语言中的分支结构语句中的if条件语句。 简单if语句的基本结构如下: 代码语言:javascript if(表达式) { 执行代码块; } 其语义是:如果表达式的值为真,则执行其后的语句,否则不执
    发表于 11-25 07:48

    C语言的常量介绍

    、-13; 实型常量:13.33、-24.4; 字符常量:‘a’、‘M’ 字符串常量:”I love china!” 在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先
    发表于 11-24 07:12

    Windows环境下32位汇编语言中文资料

    电子发烧友网站提供《Windows环境下32位汇编语言中文资料.rar》资料免费下载
    发表于 06-30 15:14 0次下载

    《ESP32S3 Arduino开发指南》第C/C++语言基础

    boolean类型。它的值只有两个:false(假)和true(真)。Boolean类型会占用1节的内存空间。3.2 运算符 C/C++语言中有多种类型的运算符,常见运算符如表3.2
    发表于 06-10 09:20