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