关于C语言中的'\?'和%%
關(guān)于C語(yǔ)言中的'\?'和%%
一、引語(yǔ)
我們知道C/C++中有四個(gè)非字母的字符需要用轉(zhuǎn)義字符來(lái)表示:單引號(hào) ' , 雙引號(hào) " , 反斜桿 \ 和問(wèn)號(hào) ?
顯然這是因?yàn)樗鼈儽旧碛刑厥獾暮x,所以要用轉(zhuǎn)義字符來(lái)表示他們自己,單引號(hào)'用來(lái)表示單個(gè)字符,雙引號(hào)"用來(lái)表示字符串,反斜桿\是轉(zhuǎn)義字符的標(biāo)志,那么問(wèn)號(hào)?呢,我們似乎想不出問(wèn)號(hào)有什么特殊含義,它為什么還要用轉(zhuǎn)義字符來(lái)表示它本身呢。
我們通過(guò)實(shí)驗(yàn)可以發(fā)現(xiàn),不管是否使用轉(zhuǎn)義字符,問(wèn)號(hào)?都能準(zhǔn)確地輸出問(wèn)號(hào)本身。
#include <stdio.h>
int main() {
? ? printf("question mark ? and escaped \?\n");
? ? return 0;
}
輸出結(jié)果是:question mark ? and escaped ?
所以問(wèn)號(hào)轉(zhuǎn)義字符\?有什么存在的必要嗎,為什么不用轉(zhuǎn)義字符也能正常輸出問(wèn)號(hào),甚至連一個(gè)編譯警告都沒(méi)有?
?
二、trigraph
為什么問(wèn)號(hào)需要轉(zhuǎn)義字符來(lái)表示它本身,顯然是因?yàn)樗_實(shí)是有特殊含義的。
我們先來(lái)了解一個(gè)詞trigraph,trigraph是三字母詞,又叫三連字。這個(gè)特性在現(xiàn)在是不受歡迎和極少使用的,但在早年條件艱苦的時(shí)候,我們的計(jì)算機(jī)鍵盤不像現(xiàn)在可以打出各種字符,所以就用三個(gè)字符連起來(lái)表示一個(gè)打不出的字符,具體如下:
Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??- Replacement: [ ] { } # \ ^ | ~舉個(gè)例子,下面是一個(gè)簡(jiǎn)單的C語(yǔ)言程序:
#include <stdio.h>
int main() {
? ? printf("[]");
? ? return 0;
}
在早年鍵盤上沒(méi)有那九個(gè)字符的時(shí)候,程序員們就這么寫:
??=include <stdio.h>
int main() ??<
? ? printf("??(??)");
? ? return 0;
??>
將 trigraph 替換成對(duì)應(yīng)的字符發(fā)生在預(yù)處理之前,因此 trigraph 可以在源碼中的任何位置都可以用,包括字符串內(nèi),函數(shù)體開(kāi)頭,預(yù)處理指令等。
實(shí)測(cè)中,codeblocks的GCC編譯器默認(rèn)不使用trigraph特性,當(dāng)你代碼中出現(xiàn)了以上三字母詞時(shí),會(huì)給出一個(gè)warning。如果有興趣實(shí)驗(yàn)一下這個(gè)trigraph特性,可以在菜單欄中點(diǎn)擊Settings -- Compiler -- Compiler settings -- Other compiler options,然后添加編譯參數(shù)-trigraphs,即可使用trigraph特性。
言歸正傳,顯然問(wèn)號(hào)?是trigraph的一個(gè)標(biāo)志,如我們要輸出"??("時(shí)最好寫成"\?\?(",防止編譯器將其誤解釋為一個(gè)trigraph。
?
三、C語(yǔ)言標(biāo)準(zhǔn)允許問(wèn)號(hào)?代表它本身
為什么不用轉(zhuǎn)義字符\?也能準(zhǔn)確輸出?本身,因?yàn)镃標(biāo)準(zhǔn)允許這么做
C11 §6.4.4.4?Character constants?Section 4
The double-quote?"?and question-mark???are representable either by themselves or by the escape sequences?\"?and?\?, respectively, but the single-quote?'?and the backslash?\shall be represented, respectively, by the escape sequences?\'?and?\\.
上面這條標(biāo)準(zhǔn)說(shuō)明了問(wèn)號(hào)?和雙引號(hào)"允許代表他們本身的字符,而單引號(hào)'和反斜杠\則必須用轉(zhuǎn)義字符來(lái)表示他們本身的字符,可能有人會(huì)有疑問(wèn),在printf中不能單用"來(lái)輸出雙引號(hào)"啊,必須要用\",這是因?yàn)?#34;在字符串中有特殊含義,不用轉(zhuǎn)義字符就會(huì)產(chǎn)生沖突。如果我們輸出單個(gè)字符putchar('"');則是允許的,不需要寫putchar('\"'); 說(shuō)明"是能代表它本身的。
?
四、關(guān)于printf中要用%%來(lái)輸出一個(gè)%,而不是\%
我們知道對(duì)于本身有特殊含義的字符,要用轉(zhuǎn)義字符來(lái)表示它本身,也知道%在printf中是格式說(shuō)明符的一個(gè)標(biāo)志,但其他轉(zhuǎn)義字符都是前面加一個(gè)反斜杠\,%前面為什么是一個(gè)%。
實(shí)際上,%%與轉(zhuǎn)義字符無(wú)關(guān),它與printf如何處理格式說(shuō)明符有關(guān),轉(zhuǎn)義字符對(duì)所有字符串有效,并在編譯時(shí)完成,格式說(shuō)明符(%)僅在一些函數(shù)使用,并在運(yùn)行時(shí)使用。簡(jiǎn)而言之,在字符串或單個(gè)字符中,%都能代表它本身,不需要也不能用%%來(lái)表示一個(gè)%,只在像printf這樣使用%作為格式說(shuō)明符的函數(shù)中規(guī)定使用%%來(lái)明確表示一個(gè)%字符。
轉(zhuǎn)載于:https://www.cnblogs.com/kangkang-/p/9405826.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的关于C语言中的'\?'和%%的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 各大浏览器的收藏夹在什么位置
- 下一篇: 微软平板电脑的优势(微软平板好不好用)