某軟件工程師接盤了前同事的項目,進度一拖再拖,最后發現問題出現在如下代碼:
// 注釋語句 ??/ 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語言入門資料(網盤鏈接免費分享):

C語言推薦書籍(PDF免費分享):
