“??/ ”这三个字符把软件工程师坑惨了

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

// 注释语句 ??/ a = b+c;

请注意代码中的“ ??/”,就是这注释隐藏的很深,让项目一拖再拖。

“??/”会被编译器当作 /,变成C语言的换行符(多行代码连接符)。于是这段代码等同于// 注释语句 a = b+c ;就会被注释掉。

下面我们就是说说“ ??/”这种“三字母词”的内容。

什么是“三字母词”

在ANSI标准中,定义了“三字母词”,或者成为“三联符序列”,英文为”trigraph sequences”。目的主要是为了在一些特定的字符集中,比如一些七位代码集中,解决一些特定字符的输入问题

“三字母词”主要有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编译器不处理“三字母词”,会将它们当做普通的字符串来处理。

1.杨福宇专栏|TESLA MODEL 3的CAN 络弱点

2.物联 安全的发展现状与展望

3.学习RTOS操作系统,有必要阅读内核源码吧?

4.用全套隔离方案安全控制大功率设备,MPS说这个容易!

5.一种可用于单片机的中断高效处理与事件机制方法

6.hex文件、bin文件、axf文件的区别?

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年11月21日
下一篇 2021年11月21日

相关推荐