某软件工程师接盘了前同事的项目,进度一拖再拖,最后发现问题出现在如下代码:
// 注释语句 ??/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文章
7642浏览量
144612 -
代码
+关注
关注
30文章
4941浏览量
73149
原文标题:C语言中的“三字母词”坑了工程师
文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
为什么单片机还在用C语言编程?
C语言的编程技巧
C语言的分支结构介绍
C语言的常量介绍
第4章 C语言基础以及流水灯的实现(4.3 4.4)
《ESP32S3 Arduino开发指南》第三章 C/C++语言基础
C语言中结构体与联合体的深度解析:内存布局与应用场景
请问STM32MP135 I2C MemAddress最多两个字节吗?
Type-C母座的普及:传统接口还能坚持多久?
技术干货驿站 ▏深入理解C语言:嵌套循环与循环控制的底层原理

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