转义序列
转义序列用于在 字符串字面量 和 字符字面量 中表示某些特殊字符。
以下转义序列可用
转义序列 | 描述 | 表示 | ||||||
---|---|---|---|---|---|---|---|---|
简单转义序列 | ||||||||
' | 单引号 | 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 | ||||||
数字转义序列 | ||||||||
| 任意八进制值 |
| ||||||
| 任意十六进制值 | 代码单元 n... (任意数量的十六进制数字) | ||||||
条件转义序列[1] | ||||||||
\c | 实现定义的 | 实现定义的 | ||||||
通用字符名称 | ||||||||
| 任意 Unicode 值; 可能导致多个代码单元 |
| ||||||
\N{NAME} (自 C++23 起) | 任意 Unicode 字符 | 由 NAME 命名的字符 (请参见 下文) |
通用字符名称的范围
如果通用字符名称对应一个不是 0x24 ($)、0x40 (@) 或 0x60 (`) 且小于 0xA0 的代码点,则程序格式错误。换句话说,基本源字符集的成员和控制字符(在范围 0x0-0x1F 和 0x7F-0x9F 中)不能在通用字符名称中表达。
(直到 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 | { | n-char-sequence | } |
pub | n-char-sequence | 一个或多个 n-char |
pub | n-char | 来自 翻译字符集 的字符,除了右大括号 } 或换行符 |
上述语法的通用字符名称是命名通用字符。如果 n-char-sequence 等于其字符名称或其类型为“control”、“correction”或“alternate”的字符名称别名之一,则它表示 Unicode 标准 (第 4.8 章 名称) 中对应的字符;否则,程序格式错误。
这些别名列在 Unicode Character Database 的 NameAliases.txt 中。这些名称或别名均不包含前导或尾随空格。
有效的 n-char-sequence 必须仅包含大写拉丁字母 A 到 Z、数字、空格和连字符。其他字符永远不会出现在 Unicode 字符名称中,因此它们出现在 n-char-sequence 中会使程序格式错误。
(自 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
)。
问号转义序列 \?
用于防止 三字母组 在字符串字面量中被解释:像这样的字符串
特性测试宏 | 值 | 标准 | 注释 |
---|---|---|---|
__cpp_named_character_escapes | 202207L | (C++23) | 命名通用字符转义 |
示例
#include <iostream>
int main()
{
std::cout << "This\nis\na\ntest\n\n";
std::cout << "She said, \"Sells she seashells on the seashore?\"\n";
}
This
is
a
test
She said, "Sells she seashells on the seashore?"
缺陷报告
以下改变行为的缺陷报告已追溯应用到先前发布的
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
CWG 505 | (C++98) | 如果反斜杠后面的字符不是表中指定的字符之一,则行为是未定义的 | 变为条件支持(语义是实现定义的) |