关于C语言中的'\?'和%%
關于C語言中的'\?'和%%
一、引語
我們知道C/C++中有四個非字母的字符需要用轉義字符來表示:單引號 ' , 雙引號 " , 反斜桿 \ 和問號 ?
顯然這是因為它們本身有特殊的含義,所以要用轉義字符來表示他們自己,單引號'用來表示單個字符,雙引號"用來表示字符串,反斜桿\是轉義字符的標志,那么問號?呢,我們似乎想不出問號有什么特殊含義,它為什么還要用轉義字符來表示它本身呢。
我們通過實驗可以發現,不管是否使用轉義字符,問號?都能準確地輸出問號本身。
#include <stdio.h>
int main() {
? ? printf("question mark ? and escaped \?\n");
? ? return 0;
}
輸出結果是:question mark ? and escaped ?
所以問號轉義字符\?有什么存在的必要嗎,為什么不用轉義字符也能正常輸出問號,甚至連一個編譯警告都沒有?
?
二、trigraph
為什么問號需要轉義字符來表示它本身,顯然是因為它確實是有特殊含義的。
我們先來了解一個詞trigraph,trigraph是三字母詞,又叫三連字。這個特性在現在是不受歡迎和極少使用的,但在早年條件艱苦的時候,我們的計算機鍵盤不像現在可以打出各種字符,所以就用三個字符連起來表示一個打不出的字符,具體如下:
Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??- Replacement: [ ] { } # \ ^ | ~舉個例子,下面是一個簡單的C語言程序:
#include <stdio.h>
int main() {
? ? printf("[]");
? ? return 0;
}
在早年鍵盤上沒有那九個字符的時候,程序員們就這么寫:
??=include <stdio.h>
int main() ??<
? ? printf("??(??)");
? ? return 0;
??>
將 trigraph 替換成對應的字符發生在預處理之前,因此 trigraph 可以在源碼中的任何位置都可以用,包括字符串內,函數體開頭,預處理指令等。
實測中,codeblocks的GCC編譯器默認不使用trigraph特性,當你代碼中出現了以上三字母詞時,會給出一個warning。如果有興趣實驗一下這個trigraph特性,可以在菜單欄中點擊Settings -- Compiler -- Compiler settings -- Other compiler options,然后添加編譯參數-trigraphs,即可使用trigraph特性。
言歸正傳,顯然問號?是trigraph的一個標志,如我們要輸出"??("時最好寫成"\?\?(",防止編譯器將其誤解釋為一個trigraph。
?
三、C語言標準允許問號?代表它本身
為什么不用轉義字符\?也能準確輸出?本身,因為C標準允許這么做
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?\\.
上面這條標準說明了問號?和雙引號"允許代表他們本身的字符,而單引號'和反斜杠\則必須用轉義字符來表示他們本身的字符,可能有人會有疑問,在printf中不能單用"來輸出雙引號"啊,必須要用\",這是因為"在字符串中有特殊含義,不用轉義字符就會產生沖突。如果我們輸出單個字符putchar('"');則是允許的,不需要寫putchar('\"'); 說明"是能代表它本身的。
?
四、關于printf中要用%%來輸出一個%,而不是\%
我們知道對于本身有特殊含義的字符,要用轉義字符來表示它本身,也知道%在printf中是格式說明符的一個標志,但其他轉義字符都是前面加一個反斜杠\,%前面為什么是一個%。
實際上,%%與轉義字符無關,它與printf如何處理格式說明符有關,轉義字符對所有字符串有效,并在編譯時完成,格式說明符(%)僅在一些函數使用,并在運行時使用。簡而言之,在字符串或單個字符中,%都能代表它本身,不需要也不能用%%來表示一個%,只在像printf這樣使用%作為格式說明符的函數中規定使用%%來明確表示一個%字符。
轉載于:https://www.cnblogs.com/kangkang-/p/9405826.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的关于C语言中的'\?'和%%的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 各大浏览器的收藏夹在什么位置
- 下一篇: jQuery常用操作