C语言合法字符型常数有哪些?

99ANYc3cd6
预计阅读时长 13 分钟
位置: 首页 C语言 正文

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

c语言中 合法的字符型常数
(图片来源网络,侵删)

下面是几种合法的字符型常数的分类和示例:


普通字符

这是最常见的形式,直接用单引号括起一个可见或不可见的 ASCII 字符。

语法: '字符'

示例:

c语言中 合法的字符型常数
(图片来源网络,侵删)
'A'       // 表示大写字母 A
'z'       // 表示小写字母 z
'9'       // 表示数字字符 9
'$'       // 表示美元符号
' '       // 表示一个空格字符
'!'       // 表示感叹号

内存表示: 在内存中,每个字符都以其对应的 ASCII 码值存储。'A' 的 ASCII 码是 65,所以在内存中它实际上存储的是整数 65,这也是为什么 C 语言允许字符型和整型之间进行隐式转换。


转义字符

当我们要表示一些特殊字符,比如单引号、换行符、制表符等无法直接输入或具有特殊含义的字符时,就需要使用转义字符,转义字符由一个反斜杠 \ 开头,后跟一个特定的字符或数字序列。

语法: '\转义序列'

常见示例:

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),最终能否正确显示取决于终端或编译环境的支持。


非法或不推荐的字符型常数

了解合法的,也要知道哪些是非法的或容易出错的:

  1. 用双引号括起来的字符: "A" 是一个字符串(String Literal),它包含两个字符:'A''\0'(字符串结束符),它不是字符型常数。

  2. 单引号内为空:非法的,编译器会报错,因为字符型常数必须包含一个字符(即使是转义形式的空字符 \0 也算)。

  3. 单引号内包含多个普通字符: 'abc' 在 C 标准中是合法的,但它的行为是实现定义的,在大多数现代编译器(如 GCC, Clang)中,它会被解释为最后一个字符 'c'强烈不建议这样使用,因为它会降低代码的可移植性,并且容易引发混淆,字符型常数应该只表示一个字符。

  4. 无效的转义序列: '\k' 是一个非法的转义序列,编译器会发出警告或错误,如果你确实想表示字母 k,直接写 'k' 即可。

类型 语法 示例 说明
普通字符 '字符' 'a', '1', 最常用的形式
转义字符 '\转义序列' '\n', '\t', '\\' 表示特殊字符和控制字符
八进制转义 '\ooo' '\101' (等于 'A') 用八进制 ASCII 码表示
十六进制转义 '\xhh' '\x41' (等于 'A') 用十六进制 ASCII 码表示
广义字符 '\uhhhh''\Uhhhhhhhh' '\u4e2d' (等于 '中') 表示 Unicode 字符

核心要点:

  • 字符型常数用单引号括起来。
  • 在底层,它被当作一个整型处理(通常是 int 类型,而不是 char 类型,这被称为 int promotion)。
  • 掌握转义字符是编写可读性强、能处理特殊输入的关键。
-- 展开阅读全文 --
头像
织梦更新文章为何时间不变?
« 上一篇 03-08
下列合法的c语言字符常量是
下一篇 » 03-08
取消
微信二维码
支付宝二维码

目录[+]