1. 程式人生 > >《C和指標》讀書筆記(1)

《C和指標》讀書筆記(1)

宣告:該讀書筆記摘抄自《C和指標》——Kenneth A.Reek (著)    徐波(譯)。為了克服自己走馬觀花,提高閱讀和學習效率,決定將自己在讀書過程中遇到的一些知識點加以摘抄和總結備忘,在此感謝原書作者和翻譯。

一、ANSI C標準之“三字母詞”

三字母詞就是三個字元的序列合起來表示另一個字元。ANSI標準並沒有規定C環境使用的字符集,但是C編譯器所使用的字符集必須包括某些特定的字元,如果你使用的字符集缺少某些字元,可以使用三字母詞替代。三字母詞以兩個“?”開頭,後面再接一個字元,例如 :

??(  [       ??)  ]       ??<  { 
??>  }       ??/  \       ??-  ~    
??!  |       ??=  #       ??'  ^


在linux  gcc下驗證時發現,gcc編譯器預設關閉了三字母詞功能,使用-trigraphs可以開啟該功能。例如:printf("Delete all the files(are you sure ??) \n"); (注:該例直接引用原文示例)。若沒有加編譯選項-trigraphs,編譯器會提示“忽略了三字母詞”,並且輸出結果為Delete all the files(are you sure ??) ;若加上-trigraphs,則列印結果為Delete all the files(are you sure ],可以看到??)已被轉換為 ] 。

同時,上述九個三字母詞中的??/ 要注意一下,例:printf("Delete all the files(are you sure ??/\n"); (注:sure 後面跟了一個三字母詞??/ ,然後又跟了一個換行符\n),gcc編譯時加上編譯選項-trigraphs,列印結果則為Delete all the files(are you sure \n,此時因為三字母詞??/被轉換為了反斜槓 \ ,而在ANSI C 標準中,兩個反斜槓會被識別為轉義字元一個反斜槓,此時,換行符\n失效。

最後,同時對兩個問號或者只對第二個問號使用轉義字元\?可以避免三字母詞。注意:只對第一個問號轉義無效,輸出仍然是三字母詞,如例所示:

例1:printf("Delete all the files(are you sure \?\?/\n"); 即兩個問號都轉義,加上編譯選項-trigraphs,輸出結果為Delete all the files(are you sure ??/

例2:printf("Delete all the files(are you sure ?\?/\n");只轉義第二個問號,加上編譯選項-trigraphs,輸出結果也是Delete all the files(are you sure ??/

例3:printf("Delete all the files(are you sure \??/\n");即只轉義第個問號,加上編譯選項-trigraphs,輸出結果卻是Delete all the files(are you sure \

二、ANSI C標準之轉義字元,轉義字元使某些無法列印的字元得以表達

\?  表示一個? ,在書寫連續多個?時使用,防止後接被解釋為三字母詞

\\  表示一個反斜槓, 防止後接字元被解釋為轉義字元

\v 垂直製表符 ,換行並縮排前一個物件的寬度

\"  表示一個字串內部的雙引號

\'  表示一個字串內部的單引號

\b 退格,例:printf("B\n");  結果是B不會被輸出

\ddd   ddd代表1~3個八進位制數字,表示該八進位制數字代表的字元,注意:若該八進位制數值超過字元定義範圍,則結果是未定義的

\xddd  ddd代表1~3個16進位制數字,表示該16進位制數字代表的字元,注意:若該16進位制數值超過字元定義範圍,則結果是未定義的

三、ASNI C之註釋

1、以 /* 開始,並以 */ 結束,中間不允許註釋巢狀;

2、所有的註釋在預處理階段會被前處理器拿掉,並以一個空格取代;因此,註釋可以出現於任何空格可以出現的地方,例如:int  /*comtent*/  x = 0;

以上為第一章和第二章總結,未完待續。。。。。