C语言中的“三字母词”坑了工程师

Posted ybhuangfugui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中的“三字母词”坑了工程师相关的知识,希望对你有一定的参考价值。

关注+星标公众,不错过精彩内容

来源 | CSDN

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

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

免责声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

------------ END ------------

后台回复『嵌入式C语言』『编译器』阅读更多相关文章。

欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

欢迎关注我的视频号:

点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

以上是关于C语言中的“三字母词”坑了工程师的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的“三字母词”坑了工程师

C语言代码片段

需要示例代码片段帮助

C++开源项目:十行代码15个BUG,你入坑了吗?

C 中的共享内存代码片段

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段