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)[1],不能像字母 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,两者是不同的。
空白字符在不同的上下文中有不同的含义,在 C 语言中空白字符定义为空格、水平 Tab、垂直 Tab、换行和分页符,本书在使用“空白字符”这个词时会明确说明在当前上下文中空白字符指的是哪些字符。 ↩︎