6. 字元類型與字元編碼

字元常量或字元型變數也可以當作整數參與運算,例如:

printf("%c\n", 'a'+1);

執行結果是b

我們知道,符號在計算機內部也用數字表示,每個字元在計算機內部用一個整數表示,稱為字元編碼(Character Encoding),目前最常用的是ASCII碼(American Standard Code for Information Interchange,美國信息交換標準碼),詳見圖 A.1 “ASCII碼表”。表中每一欄的最後一列是字元,前三列分別是用十進制(Dec)、十六進制(Hx)和八進制(Oct)表示的字元編碼,各種進制之間的換算將在第 2 節 “不同進制之間的換算”介紹。從十進制那一列可以看出ASCII碼的取值範圍是0~127。表中的很多字元是不可見字元(Non-printable Character)或空白字元(Whitespace)[3],不能像字母a這樣把字元本身填在表中,而是用一個名字來描述該字元,例如CR(carriage return)、LF(NL line feed,newline)、DEL等等。作為練習,請讀者查一查表 2.1 “C標準規定的轉義字元”中的字元在ASCII碼表中的什麼位置。

回到剛纔的例子,在ASCII碼中字元a是97,字元b是98。計算'a'+1這個表達式,應該按ASCII碼把'a'當作整數值97,然後加1,得到98,然後printf把98這個整數值當作ASCII碼來解釋,打印出相應的字元b

之前我們說“整型”是指int型,而現在我們知道char型本質上就是整數,只不過取值範圍比int型小,所以以後我們把char型和int型統稱為整數類型(Integer Type)或簡稱整型,以後我們還要學習幾種類型也屬於整型,將在第 1 節 “整型”詳細介紹。

字元'a'~'z''A'~'Z''0'~'9'的ASCII碼都是連續的,因此表達式'a'+25'z'的值相等,'0'+9'9'的值也相等。注意'0'~'9'的ASCII碼是十六進制的30~39,和整數值0~9是不相等的。

字元也可以用ASCII碼轉義序列表示,這種轉義序列由\加上1~3個八進制數字組成,或者由\x或大寫\X加上1~2個十六進制數字組成,可以用在字元常量或字元串字面值中。例如'\0'表示NUL字元(Null Character)'\11''\x9'表示Tab字元,"\11""\x9"表示由Tab字元組成的字元串。注意'0'的ASCII碼是48,而'\0'的ASCII碼是0,兩者是不同的。



[3] 空白字元在不同的上下文中有不同的含義,在C語言中空白字元定義為空格、水平Tab、垂直Tab、換行和分頁符,本書在使用“空白字元”這個詞時會明確說明在當前上下文中空白字元指的是哪些字元。