在 C 语言中,字符型常数用于表示单个字符,它通常用单引号 () 括起来,需要注意的是,单引号是界定符,它本身不是字符型常数的一部分。

下面是几种合法的字符型常数的分类和示例:
普通字符
这是最常见的形式,直接用单引号括起一个可见或不可见的 ASCII 字符。
语法: '字符'
示例:

'A' // 表示大写字母 A 'z' // 表示小写字母 z '9' // 表示数字字符 9 '$' // 表示美元符号 ' ' // 表示一个空格字符 '!' // 表示感叹号
内存表示:
在内存中,每个字符都以其对应的 ASCII 码值存储。'A' 的 ASCII 码是 65,所以在内存中它实际上存储的是整数 65,这也是为什么 C 语言允许字符型和整型之间进行隐式转换。
转义字符
当我们要表示一些特殊字符,比如单引号、换行符、制表符等无法直接输入或具有特殊含义的字符时,就需要使用转义字符,转义字符由一个反斜杠 \ 开头,后跟一个特定的字符或数字序列。
语法: '\转义序列'
常见示例:

| 转义字符 | 名称/含义 | ASCII 码 | 说明 |
|---|---|---|---|
\n |
换行 | 10 | 光标移到下一行开头 |
\t |
水平制表符 | 9 | 光标移到下一个制表位 |
\r |
回车 | 13 | 光标移到当前行开头 |
\\ |
反斜杠本身 | 92 | 用于表示一个普通的反斜杠 |
\' |
单引号本身 | 39 | 用于表示一个普通的单引号 |
\" |
双引号本身 | 34 | 主要用于字符串内部,表示一个普通的双引号 |
\b |
退格 | 8 | 光标向前退一格 |
\0 |
空字符 (Null Character) | 0 | 字符串的结束标志 |
示例代码:
#include <stdio.h>
int main() {
printf("Hello\tWorld\n"); // 输出: Hello World (然后换行)
printf("He said, \"C is fun.\"\n"); // 输出: He said, "C is fun."
printf("The path is C:\\Users\\Guest\n"); // 输出: The path is C:\Users\Guest
printf("Backspace test:\b\b\bEnd\n"); // 输出: Backspace test:End (删除了 "test:" 中的 "st:")
return 0;
}
八进制转义序列
我们可以用字符的八进制 ASCII 码值来表示该字符。
语法: '\ooo' (o 是 0 到 7 的数字)
规则:
- 最多可以跟 3 位八进制数。
- 如果是 3 位数,则范围必须在
\000到\377之间(即 0 到 255)。 - 如果不足 3 位,只要能组成一个有效的八进制数即可。
示例:
'\101' // 等价于 'A',因为 'A' 的八进制 ASCII 码是 101 '\12' // 等价于 '\n' (换行符),因为换行符的八进制 ASCII 码是 12 '\0' // 等价于空字符,八进制 0 '\777' // 八进制 777 超出了 unsigned char 的范围 (0-255),行为是未定义的
十六进制转义序列
与八进制类似,我们可以用字符的十六进制 ASCII 码值来表示该字符。
语法: '\xhh' (h 是 0-9, a-f, A-F 的十六进制数字)
规则:
\x后面可以跟一个或多个十六进制数字。- 数字的数量没有严格限制,只要能表示一个有效的字节值(0x00 到 0xFF)即可,编译器会读取尽可能多的有效十六进制数字。
示例:
'\x41' // 等价于 'A',因为 'A' 的十六进制 ASCII 码是 41 '\xA' // 等价于 '\n' (换行符),因为换行符的十六进制 ASCII 码是 A (即 10) '\x0' // 等价于空字符 '\x1G' // 'G' 不是有效的十六进制数字,所以只有 '\x1' 被解析,'G' 被当作普通字符,结果是未定义的
广义字符 (Universal Character Name, UCN)
这是 C99 标准引入的特性,用于表示源字符集中的字符,特别是非 ASCII 字符(如汉字、带音调的字母等)。
语法:
\u后跟 4 个十六进制数字:'\uhhhh'\U后跟 8 个十六进制数字:'\Uhhhhhhhh'
示例:
'\u4e2d' // 表示汉字 '中' (Unicode 码点是 U+4E2D) '\u00e9' // 表示带重音符号的 'é' (Unicode 码点是 U+00E9)
注意: UCN 在编译器内部会被转换为其对应的内部表示(如 UTF-8 或 UTF-32),最终能否正确显示取决于终端或编译环境的支持。
非法或不推荐的字符型常数
了解合法的,也要知道哪些是非法的或容易出错的:
-
用双引号括起来的字符:
"A"是一个字符串(String Literal),它包含两个字符:'A'和'\0'(字符串结束符),它不是字符型常数。 -
单引号内为空: 是非法的,编译器会报错,因为字符型常数必须包含一个字符(即使是转义形式的空字符
\0也算)。 -
单引号内包含多个普通字符:
'abc'在 C 标准中是合法的,但它的行为是实现定义的,在大多数现代编译器(如 GCC, Clang)中,它会被解释为最后一个字符'c'。强烈不建议这样使用,因为它会降低代码的可移植性,并且容易引发混淆,字符型常数应该只表示一个字符。 -
无效的转义序列:
'\k'是一个非法的转义序列,编译器会发出警告或错误,如果你确实想表示字母k,直接写'k'即可。
| 类型 | 语法 | 示例 | 说明 |
|---|---|---|---|
| 普通字符 | '字符' |
'a', '1', |
最常用的形式 |
| 转义字符 | '\转义序列' |
'\n', '\t', '\\' |
表示特殊字符和控制字符 |
| 八进制转义 | '\ooo' |
'\101' (等于 'A') |
用八进制 ASCII 码表示 |
| 十六进制转义 | '\xhh' |
'\x41' (等于 'A') |
用十六进制 ASCII 码表示 |
| 广义字符 | '\uhhhh' 或 '\Uhhhhhhhh' |
'\u4e2d' (等于 '中') |
表示 Unicode 字符 |
核心要点:
- 字符型常数用单引号括起来。
- 在底层,它被当作一个整型处理(通常是
int类型,而不是char类型,这被称为int promotion)。 - 掌握转义字符是编写可读性强、能处理特殊输入的关键。
