跳到主要内容

转义序列

转义序列用于在 字符串字面量字符字面量 中表示某些特殊字符。

以下转义序列可用

转义序列描述表示
简单转义序列
'单引号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
\o{n...} (自 C++23 起)
任意八进制值
代码单元 nnn (1~3 位八进制数字)
代码单元 n... (任意数量的八进制数字)
\xn...
\x{n...} (自 C++23 起)
任意十六进制值代码单元 n... (任意数量的十六进制数字)
条件转义序列[1]
\c实现定义的实现定义的
通用字符名称
\unnnn
\u{n..} (自 C++23 起)
\Unnnnnnnn
任意 Unicode 值;
可能导致多个代码单元
代码点 U+nnnn (4 位十六进制数字)
代码点 U+n... (任意数量的十六进制数字)
代码点 U+nnnnnnnn (8 位十六进制数字)
\N{NAME} (自 C++23 起)任意 Unicode 字符NAME 命名的字符 (请参见 下文)
  1. 条件转义序列是条件支持的。每个条件转义序列中的字符 c 是 基本源字符集 (直到 C++23)基本字符集 (自 C++23 起) 的成员,且不是紧跟在除其他转义序列中的反斜杠后面的字符。

通用字符名称的范围

如果通用字符名称对应一个不是 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}
pubn-char-sequence一个或多个 n-char
pubn-char来自 翻译字符集 的字符,除了右大括号 } 或换行符

上述语法的通用字符名称是命名通用字符。如果 n-char-sequence 等于其字符名称或其类型为“control”、“correction”或“alternate”的字符名称别名之一,则它表示 Unicode 标准 (第 4.8 章 名称) 中对应的字符;否则,程序格式错误。

这些别名列在 Unicode Character DatabaseNameAliases.txt 中。这些名称或别名均不包含前导或尾随空格。

有效的 n-char-sequence 必须仅包含大写拉丁字母 A 到 Z、数字、空格和连字符。其他字符永远不会出现在 Unicode 字符名称中,因此它们出现在 n-char-sequence 中会使程序格式错误。

 (自 C++23 起)

备注

\0 是最常用的八进制转义序列,因为它在 空终止字符串 中表示终止的空字符。

换行符 \n文本模式 I/O 中具有特殊含义:它将被转换为特定于操作系统的换行符表示,通常是一个字节或字节序列。某些系统会使用长度字段标记其行。

八进制转义序列最多可以有三个八进制数字,但如果遇到非八进制数字的字符,则会提前终止。

十六进制转义序列没有长度限制,并在遇到第一个非十六进制数字的字符时终止。如果单个十六进制转义序列表示的值不适合该字符串字面量中使用的字符类型(charchar8_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 起)

特性测试宏标准注释
__cpp_named_character_escapes202207L(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)如果反斜杠后面的字符不是表中指定的字符之一,则行为是未定义的变为条件支持(语义是实现定义的)

转义序列

转义序列用于在 字符串字面量字符字面量 中表示某些特殊字符。

以下转义序列可用

转义序列描述表示
简单转义序列
'单引号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
\o{n...} (自 C++23 起)
任意八进制值
代码单元 nnn (1~3 位八进制数字)
代码单元 n... (任意数量的八进制数字)
\xn...
\x{n...} (自 C++23 起)
任意十六进制值代码单元 n... (任意数量的十六进制数字)
条件转义序列[1]
\c实现定义的实现定义的
通用字符名称
\unnnn
\u{n..} (自 C++23 起)
\Unnnnnnnn
任意 Unicode 值;
可能导致多个代码单元
代码点 U+nnnn (4 位十六进制数字)
代码点 U+n... (任意数量的十六进制数字)
代码点 U+nnnnnnnn (8 位十六进制数字)
\N{NAME} (自 C++23 起)任意 Unicode 字符NAME 命名的字符 (请参见 下文)
  1. 条件转义序列是条件支持的。每个条件转义序列中的字符 c 是 基本源字符集 (直到 C++23)基本字符集 (自 C++23 起) 的成员,且不是紧跟在除其他转义序列中的反斜杠后面的字符。

通用字符名称的范围

如果通用字符名称对应一个不是 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}
pubn-char-sequence一个或多个 n-char
pubn-char来自 翻译字符集 的字符,除了右大括号 &rcub; 或换行符

上述语法的通用字符名称是命名通用字符。如果 n-char-sequence 等于其字符名称或其类型为“control”、“correction”或“alternate”的字符名称别名之一,则它表示 Unicode 标准 (第 4.8 章 名称) 中对应的字符;否则,程序格式错误。

这些别名列在 Unicode Character DatabaseNameAliases.txt 中。这些名称或别名均不包含前导或尾随空格。

有效的 n-char-sequence 必须仅包含大写拉丁字母 A 到 Z、数字、空格和连字符。其他字符永远不会出现在 Unicode 字符名称中,因此它们出现在 n-char-sequence 中会使程序格式错误。

 (自 C++23 起)

备注

\0 是最常用的八进制转义序列,因为它在 空终止字符串 中表示终止的空字符。

换行符 \n文本模式 I/O 中具有特殊含义:它将被转换为特定于操作系统的换行符表示,通常是一个字节或字节序列。某些系统会使用长度字段标记其行。

八进制转义序列最多可以有三个八进制数字,但如果遇到非八进制数字的字符,则会提前终止。

十六进制转义序列没有长度限制,并在遇到第一个非十六进制数字的字符时终止。如果单个十六进制转义序列表示的值不适合该字符串字面量中使用的字符类型(charchar8_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 起)

特性测试宏标准注释
__cpp_named_character_escapes202207L(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)如果反斜杠后面的字符不是表中指定的字符之一,则行为是未定义的变为条件支持(语义是实现定义的)