字元常量或字元型變數也可以當作整數參與運算,例如:
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,兩者是不同的。