转义序列
转义序列用于在字符串字面量和字符字面量中表示某些特殊字符(无法直接输入或显示的字符)。
可以使用下列转义序列:
转义序列 | 描述 | 表示 |
---|---|---|
简单转义序列 | ||
\'
|
单引号 | ASCII 编码中为字节 0x27
|
\"
|
双引号 | ASCII 编码中为字节 0x22
|
\?
|
问号 | ASCII 编码中为字节 0x3f
|
\\
|
反斜杠 | ASCII 编码中为字节 0x5c
|
\a
|
响铃 | ASCII 编码中为字节 0x07
|
\b
|
退格 | ASCII 编码中为字节 0x08
|
\f
|
换页 | ASCII 编码中为字节 0x0c
|
\n
|
换行 | ASCII 编码中为字节 0x0a
|
\r
|
回车 | ASCII 编码中为字节 0x0d
|
\t
|
水平制表 | ASCII 编码中为字节 0x09
|
\v
|
垂直制表 | ASCII 编码中为字节 0x0b
|
数值转义序列 | ||
\nnn
|
任意八进制值 | 字节 nnn (1~3位八进制数位)
|
\o{n...} (C++23 起)
|
字节 n... (任意位数的八进制数位)
| |
\xn...
|
任意十六进制值 | 字节 n... (任意位数的十六进制数位)
|
\x{n...} (C++23 起)
| ||
条件转义序列[1] | ||
\c
|
实现定义 | 实现定义 |
通用字符名 | ||
\unnnn
|
任意 Unicode 值: 可能生成多个编码单元 |
编码点 U+nnnn (4位十六进制数位)
|
\u{n...} (C++23 起)
|
编码点 U+n... (任意位数的十六进制数位)
| |
\Unnnnnnnn
|
编码点 U+nnnnnnnn (8位十六进制数位)
| |
\N{name} (C++23 起)
|
任意 Unicode 字符 | 以 name 命名的字符(见下文)
|
通用字符名的范围
如果有一个通用字符名对应了一个小于 0xA0 且不是 0x24( |
(C++11 前) |
如果在字符和字符串字面量以外有一个通用字符名对应了一个基础源字符集的成员或控制字符的码位,那么程序非良构。 如果有一个通用字符名对应了一个代理码位(范围 0xD800-0xDFFF,含两端),那么程序非良构。 如果有一个用于 UTF-16/32 字符串字面量的通用字符名不对应 ISO/IEC 10646 中的任何码位(范围 0x0-0x10FFFF,含两端)那么程序非良构。 |
(C++11 起) (C++20 前) |
如果在字符和字符串字面量以外有一个通用字符名对应了一个基础源字符集的成员或控制字符的码位,那么程序非良构。 如果有一个通用字符名不对应 ISO/IEC 10646 中的任何码位(范围 0x0-0x10FFFF,含两端)或对应了一个代理码位(范围 0xD800-0xDFFF,含两端),那么程序非良构。 |
(C++20 起) (C++23 前) |
如果在字符和字符串字面量以外有一个通用字符名对应了一个基础字符集的字符或控制字符的标量值,那么程序非良构。 如果有一个通用字符名不对应翻译字符集中的任何字符的标量值,那么程序非良构。 |
(C++23 起) |
具名通用字符转义
具有以上形式的通用字符名是 具名通用字符。它在以下情况下表示 Unicode 标准(第 4.8 章 名称)中的对应字符:
在其他情况下程序非良构。 这些别名在 Unicode 字符数据库的 NameAliases.txt 列出。这些名字和别名都不会以空格开始或结束。 |
(C++23 起) |
注解
\0 在八进制转义序列中最常用,因为它表示空终止字符串中的空终止字符。
换行符 \n 在用于文本模式 I/O 时有特殊含义:它被转换为操作系统指定的换行符表示,通常是一个字节或字节序列。某些系统转而用长度字段标记文本行。
八进制转义序列具有三个八进制位的长度限制,但如果遇到首个不是合法八进制位的字符,那么就会在此处提前终止。
十六进制转义序列无长度限制,并在首个不是合法十六进制位的字符处终止。如果单个十六进制转义序列所表示的值不适于此字符串字面量或字符常量中使用的字符类型(char、char8_t (C++20 起)、char16_t、char32_t (C++11 起) 或 wchar_t),那么结果未指明。
窄字符串字面量或 16 位字符串字面量中的通用字符名可能映射到多于一个编码单元,例如 \U0001f34c 在 UTF-8 中是 4 个 char 编码单元(\xF0\x9F\x8D\x8C),而在 UTF-16 中是 2 个 char16_t 编码单元(\xD83C\xDF4C)。 |
(C++11 起) |
问号转义序列 \? 用于阻止在字符串字面量内转译三标符:如 "??/" 的字符串被编译成 "\",但如果在 "?\?/" 中转义第二个问号,那么它会变成 "??/"。由于三标符已从 C++ 移除,不再需要使用问号转义序列。它因为需要与 C++14 (及之前标准版本)及 C 的兼容而保留。 (C++17 起)
示例
输出:
这 是 一个 测试 She said, "Sells she seashells on the seashore?"
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
CWG 505 | C++98 | 当反斜杠后面的字符不是表格中指定的字符之一时,行为未定义 | 改为受条件性支持(此时语义由实现定义) |