转义序列
转义序列用于表示 字符串字面量 和 字符字面量 中的某些特殊字符。
以下转义序列可用
转义符 序列 |
描述 | 表示 |
---|---|---|
简单转义序列 | ||
\'
|
单引号 | 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 命名的字符(见 下方) |
目录 |
[编辑] 通用字符名的范围
如果通用字符名对应的代码点不是 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 起) |
具名通用字符转义
上述语法的通用字符名是具名通用字符。如果 n-字符序列 等于其字符名称或其类型为“control”、“correction”或“alternate”的字符名称别名之一,则它指定 Unicode 标准(第 4.8 节 名称)中的相应字符;否则,程序是非良构的。 这些别名在 Unicode 字符数据库 的 NameAliases.txt 中列出。这些名称或别名都没有前导或尾随空格。 有效的 n-字符序列 必须仅包含大写拉丁字母 A 到 Z、数字、空格和连字符减号。其他字符永远不会出现在 Unicode 字符名称中,因此它们在 n-字符序列 中的出现始终使程序成为非良构的。 |
(自 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 起)
特性测试宏 | 值 | Std | 特性 |
---|---|---|---|
__cpp_named_character_escapes |
202207L |
(C++23) | 具名通用字符转义 |
[编辑] 示例
输出
This is a test She said, "Sells she seashells on the seashore?"
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
CWG 505 | C++98 | 如果反斜杠后面的字符不是表中指定的字符之一,则行为未定义 反斜杠后面的字符不是表中指定的字符之一 |
变为有条件支持 (语义是实现定义的) |
[编辑] 参见
C 文档 关于 转义序列
|