某軟件工程師接盤了前同事的項(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ǔ)言的書籍中,我們都看不到對(duì)“三字母詞”的講解。這里資料來(lái)源于參考ANSI C99標(biāo)準(zhǔn)(即傳說(shuō)中的《American National Standards Institute for Programming Languages-C》 1999年,我們習(xí)慣簡(jiǎn)稱為“C99”)。
“三字母詞”主要有9個(gè),分別為:三字母詞對(duì)應(yīng)的字符
??=#
??([
??)]
??《{
??》}
??//
??!|
??‘^
??-~
源代碼中的“三字母詞”,在編譯階段會(huì)被替換為“對(duì)應(yīng)的字符”。對(duì)于以“?”開頭的字符序列,如果不能與上面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??):
最后
由于編譯器的種類各樣,對(duì)ANSI C的支持也不一樣,所以可能會(huì)有些C編譯器不處理“三字母詞”,會(huì)將它們當(dāng)做普通的字符串來(lái)處理。
責(zé)任編輯:haq
-
C語(yǔ)言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145579 -
代碼
+關(guān)注
關(guān)注
30文章
4968瀏覽量
73960
原文標(biāo)題:C語(yǔ)言中的“三字母詞”坑了工程師
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
c語(yǔ)言中的代碼優(yōu)化
C語(yǔ)言主要特點(diǎn)
C語(yǔ)言中實(shí)現(xiàn)函數(shù)宏的三種方式
單片機(jī)c語(yǔ)言中定義字節(jié)怎么定義?
請(qǐng)問(wèn)C語(yǔ)言中整形溢出會(huì)產(chǎn)生哪些異常行為?
請(qǐng)問(wèn)C語(yǔ)言中整形溢出對(duì)哪些應(yīng)用場(chǎng)景影響較大?
C語(yǔ)言與C++的區(qū)別及聯(lián)系
Typedef在C語(yǔ)言中的應(yīng)用
C語(yǔ)言的分支結(jié)構(gòu)介紹
C語(yǔ)言的常量介紹
Windows環(huán)境下32位匯編語(yǔ)言中文資料
深入理解C語(yǔ)言:C語(yǔ)言循環(huán)控制
C語(yǔ)言中的“三字母詞”是什么
評(píng)論