1. 程式人生 > >c預言中的trigraph,及三字母字元

c預言中的trigraph,及三字母字元

C語言中鮮為人知的“三字母詞” (trigraph sequences)

個人分類: C

Technorati 標籤: C語言,三字母詞,trigraph sequences,三聯符序列,C99,ANSI C

         在ANSI標準中,定義了“三字母詞”,或者成為“三聯符序列”,英文為"trigraph sequences"。目的主要是為了在一些特定的字符集中,比如一些七位程式碼集中,解決一些特定字元的輸入問題。

         也許是由於這些字符集我們基本上用不到,所以在大多數C語言的書籍中,我們都看不到對“三字母詞”的講解。這裡資料來源於參考ANSI C99標準(即傳說中的《American National Standards Institute for Programming Languages-C》 1999年,我們習慣簡稱為“C99”)。

        截止到現在,“三字母詞”有且僅有9個,分別為: 

三字母詞 對應的字元
??= #
??( [
??) ]
??< {
??> }
??/ /
??! |
??' ^
??- ~

       就這9個,沒有其他的三字母詞。原始碼中的“三字母詞”,在編譯階段會被替換為“對應的字元”。對於以“?”開頭的字元序列,如果不能與上面9個匹配,編譯器將保持原狀;一旦匹配,編譯器就會做替換。

       例子1——C99標準中給出的例子:

  1. printf("Eh???/n");  

相當於

  1. printf("Eh/n");  

       例子2——一個我們容易犯的錯誤(摘自《Pointers On C》):

  1. printf("Delete file (are you really sure??):");  

執行結果為(三字母詞“??)”編譯時替換為“]”):

Delete file (are you really sure]: 

而不是我們想象中的:

Delete file (are you really sure??): 

       注意:由於編譯器的種類各樣,對ANSI C的支援也不一樣,所以可能會有些C編譯器不處理“三字母詞”,會將它們當做普通的字串來處理。

       我的測試環境為:Windows 7, DEC C++(帶mingw版),即編譯環境mingw下的gcc。這個編譯器預設就是不識別“三字元詞”,如果希望讓其識別,就需要讓gcc支援標準,需要在編譯的時候新增選擇"-ansi"或者"-trigraphs"。手動編譯時在命令列中大家都會用;在DEV C++圖形介面中,兩種方法:在“工具”—>“編譯選項”中,在“編譯器”選項卡下,在“編譯時加入以下命令”輸入框中輸入"-ansi"或者輸入"-trigraphs",並且勾選該選項,這樣編譯執行的結果就會識別三字母詞;在“工具”—>“編譯選項”中,在“程式碼生成/優化”選項卡下,左側選中“C編譯器”,右側將“支援所有ANSI C標準”修改成“Yes”,然後編譯執行即可。  兩種方法的參考截圖如下:

方法①

方法②

DEV-C  支援ANSI-C標準1 DEV-C  支援ANSI-C標準2