日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于C语言中的'\?'和%%

發布時間:2023/12/2 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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语言中的'\?'和%%的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。