某軟件工程師接盤了前同事的項目,進度一拖再拖,最后發(fā)現(xiàn)問題出現(xiàn)在如下代碼:
// 注釋語句 ??/2a = b+c;
請注意代碼中的“??/”,就是這注釋隱藏的很深,讓項目一拖再拖。
“??/”會被編譯器當(dāng)作 /,變成C語言的換行符(多行代碼連接符)。于是這段代碼等同于// 注釋語句 a = b+c ;就會被注釋掉。
下面我們就是說說“??/”這種“三字母詞”的內(nèi)容。
什么是“三字母詞”
在ANSI標(biāo)準(zhǔn)中,定義了“三字母詞”,或者成為“三聯(lián)符序列”,英文為“trigraph sequences”。目的主要是為了在一些特定的字符集中,比如一些七位代碼集中,解決一些特定字符的輸入問題。
也許是由于這些字符集我們基本上用不到,所以在大多數(shù)C語言的書籍中,我們都看不到對“三字母詞”的講解。這里資料來源于參考ANSI C99標(biāo)準(zhǔn)(即傳說中的《American National Standards Institute for Programming Languages-C》 1999年,我們習(xí)慣簡稱為“C99”)。
“三字母詞”主要有9個,分別為:三字母詞對應(yīng)的字符
??=#
??([
??)]
??《{
??》}
??//
??!|
??‘^
??-~
源代碼中的“三字母詞”,在編譯階段會被替換為“對應(yīng)的字符”。對于以“?”開頭的字符序列,如果不能與上面9個匹配,編譯器將保持原狀;一旦匹配,編譯器就會做替換。
“三字母詞”例子
例子1:C99標(biāo)準(zhǔn)中給出的例子
printf(“Eh???/n”);
相當(dāng)于:
printf(“Eh/n”);
例子2:一個我們?nèi)菀追傅腻e誤(摘自《Pointers On C》)
printf(“Delete file (are you really sure??):”);
運行結(jié)果為(三字母詞“??)”編譯時替換為“]”):
Delete file (are you really sure]:
而不是我們想象中的:
Delete file (are you really sure??):
最后
由于編譯器的種類各樣,對ANSI C的支持也不一樣,所以可能會有些C編譯器不處理“三字母詞”,會將它們當(dāng)做普通的字符串來處理。
責(zé)任編輯:haq
-
C語言
+關(guān)注
關(guān)注
183文章
7642瀏覽量
145141 -
代碼
+關(guān)注
關(guān)注
30文章
4956瀏覽量
73516
原文標(biāo)題:C語言中的“三字母詞”坑了工程師
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
c語言中的代碼優(yōu)化
C語言中實現(xiàn)函數(shù)宏的三種方式
單片機c語言中定義字節(jié)怎么定義?
C語言與C++的區(qū)別及聯(lián)系
Typedef在C語言中的應(yīng)用
C語言的分支結(jié)構(gòu)介紹
C語言的常量介紹
Windows環(huán)境下32位匯編語言中文資料
深入理解C語言:C語言循環(huán)控制
C語言中的“三字母詞”是什么
評論