命名空间
变体
操作

转义序列

来自 cppreference.cn
< cpp‎ | 语言
 
 
C++ 语言
 
 

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

以下转义序列可用:

转义
序列
描述 表示
简单转义序列
\' 单引号 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 命名的字符(参见下方
  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 }
n-char-sequence - 一个或多个 n-char
n-char - 来自翻译字符集的字符,除了右大括号 } 或换行符

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

这些别名列在 Unicode 字符数据库NameAliases.txt 中。这些名称或别名都没有前导或尾随空格。

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

(C++23 起)

[编辑] 备注

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

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

八进制转义序列最多包含三个八进制数字,但如果遇到第一个不是有效八进制数字的字符,则会提前终止。

十六进制转义序列没有长度限制,并在遇到第一个不是有效十六进制数字的字符时终止。如果单个十六进制转义序列表示的值不符合此字符串字面量中使用的字符类型(charchar8_t(自 C++20 起)char16_tchar32_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_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?"

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
CWG 505 C++98 反斜杠后面的字符不在表中指定
行为未定义
改为有条件支持
(语义由实现定义)

[编辑] 另请参见

C 文档 关于 转义序列