C語言中的“三字母詞”坑了工程師

ybhuangfugui 2021-08-16 01:00:52 阅读数:338

本文一共[544]字,预计阅读时长:1分钟~
言中 三字 字母 工程

關注+星標公眾,不錯過精彩內容

來源 | 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”查看更多內容。

歡迎關注我的視頻號:

點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。

版权声明:本文为[ybhuangfugui]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210816010025132d.html