命名空间
变体
操作

转义序列

来自 cppreference.cn
< cpp‎ | language
 
 
C++ 语言
通用主题
关键字
转义序列
流程控制
条件执行语句
if
迭代语句(循环)
for
范围 for (C++11)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常规范 (直到 C++17*)
noexcept 说明符 (C++11)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
存储期说明符
初始化
 
 

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

以下转义序列可用

转义符
序列
描述 表示
简单转义序列
\' 单引号 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-字符序列 }
n-字符序列 - 一个或多个 n-字符
n-字符 - 来自 翻译字符集 的字符,但右花括号 } 或换行符除外

上述语法的通用字符名是具名通用字符。如果 n-字符序列 等于其字符名称或其类型为“control”、“correction”或“alternate”的字符名称别名之一,则它指定 Unicode 标准第 4.8 节 名称)中的相应字符;否则,程序是非良构的。

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

有效的 n-字符序列 必须仅包含大写拉丁字母 A 到 Z、数字、空格和连字符减号。其他字符永远不会出现在 Unicode 字符名称中,因此它们在 n-字符序列 中的出现始终使程序成为非良构的。

(自 C++23 起)

[编辑] 注解

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

换行符 \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 起)

特性测试宏 Std 特性
__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++ 标准。

DR 应用于 已发布行为 正确行为
CWG 505 C++98 如果反斜杠后面的字符不是表中指定的字符之一,则行为未定义
反斜杠后面的字符不是表中指定的字符之一
变为有条件支持
(语义是实现定义的)

[编辑] 参见

C 文档 关于 转义序列