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標準中給出的例子:
- printf("Eh???/n");
相當於
- printf("Eh/n");
例子2——一個我們容易犯的錯誤(摘自《Pointers On C》):
- 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”,然後編譯執行即可。 兩種方法的參考截圖如下:
方法① |
方法② |