Namespaces
Variants

Escape sequences

From cppreference.net
C++ language
General topics
Keywords
Escape sequences
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

以下转义序列可用:

转义
序列
描述 表示形式
简单转义序列
\' 单引号 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 命名的字符 (参见 下文 )
  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 等于其字符名称或等于其“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) 命名通用字符转义

示例

#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 文档 关于 转义序列