Escape sequences
转义序列用于在 字符串字面量 和 字符字面量 中表示某些特殊字符。
以下转义序列可用:
|
转义
序列 |
描述 | 表示形式 |
|---|---|---|
| 简单转义序列 | ||
\'
|
单引号 |
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...
(任意数量八进制数字)
|
|
\x
n...
|
任意十六进制值 |
码元
n...
(任意数量十六进制数字)
|
\x{
n...
}
(自 C++23 起)
|
||
| 条件转义序列 [1] | ||
\
c
|
由实现定义 | 由实现定义 |
| 通用字符名称 | ||
\u
nnnn
|
任意
Unicode
值;
可能产生多个码元 |
码点
U+
nnnn
(4 位十六进制数字)
|
\u{
n...
}
(自 C++23 起)
|
码点
U+
n...
(任意数量十六进制数字)
|
|
\U
nnnnnnnn
|
码点
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-char-sequence 等于其字符名称或等于其“control”、“correction”或“alternate”类型的字符名称别名时,它指代 Unicode标准 ( 第4.8章 名称 )中的对应字符;否则程序非良构。 这些别名列于 Unicode字符数据库 的 NameAliases.txt 中。所有名称和别名均无前导或尾随空格。 有效的 n-char-sequence 必须仅包含大写拉丁字母A至Z、数字、空格和连字符。其他字符永远不会出现在Unicode字符名称中,因此它们在 n-char-sequence 中的出现始终会导致程序非良构。 |
(since 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 )。 |
(since C++11) |
问号转义序列 \ ? 用于防止字符串字面值内的 三字符组 被解释:例如字符串 "??/" 会被编译为 " \" ,但若第二个问号被转义,如 "? \? /" ,则会变成 "??/" 。 由于三字符组已从 C++ 中移除,问号转义序列不再必要。该特性被保留以兼容 C++14(及先前版本)和 C 语言。 (C++17 起)
| 功能测试宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_named_character_escapes
|
202207L
|
(C++23) | 命名通用字符转义 |
示例
输出:
This is a test She said, "Sells she seashells on the seashore?"
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| CWG 505 | C++98 |
若反斜杠后跟随的字符不是表格中指定的字符之一,
则行为未定义 |
改为有条件支持
(语义由实现定义) |
参见
|
C 文档
关于
转义序列
|