转义序列

来自cppreference.com
< cpp‎ | language
 
 
 
表达式
概述
值类别(左值 lvalue、右值 rvalue、亡值 xvalue)
求值顺序(序列点)
常量表达式
潜在求值表达式
初等表达式
lambda 表达式(C++11)
字面量
整数字面量
浮点字面量
布尔字面量
字符字面量,包含转义序列
字符串字面量
空指针字面量(C++11)
用户定义字面量(C++11)
运算符
赋值运算符a=ba+=ba-=ba*=ba/=ba%=ba&=ba|=ba^=ba<<=ba>>=b
自增与自减++a--aa++a--
算术运算符+a-aa+ba-ba*ba/ba%b~aa&ba|ba^ba<<ba>>b
逻辑运算符a||ba&&b!a
比较运算符a==ba!=ba<ba>ba<=ba>=ba<=>b(C++20)
成员访问运算符a[b]*a&aa->ba.ba->*ba.*b
其他运算符a(...)a,ba?b:c
new 表达式
delete 表达式
throw 表达式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
折叠表达式(C++17)
运算符的代用表示
优先级和结合性
运算符重载
默认比较(C++20)
类型转换
隐式转换
一般算术转换
const_cast
static_cast
reinterpret_cast
dynamic_cast
显式转换 (T)a, T(a)
用户定义转换
 

转义序列用于在字符串字面量字符字面量中表示某些特殊字符(无法直接输入或显示的字符)。

可以使用下列转义序列:

转义序列 描述 表示
简单转义序列
\' 单引号 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 起)中的成员,且不是任何其他转义序列中后随 \ 的字符。

通用字符名的范围

如果有一个通用字符名对应了一个小于 0xA0 且不是 0x24($)、0x40(@)或 0x60(`)的码位,那么程序非良构。换言之,通用字符名不能表达基础源字符集的成员与控制字符(范围为 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字符 - 来自翻译字符集去掉右花括号 } 和换行符后的字符

具有以上形式的通用字符名是 具名通用字符。它在以下情况下表示 Unicode 标准第 4.8 章 名称)中的对应字符:

  • n字符序列 与该字符的名称相等
  • n字符序列 与该字符的别名之中类型是 “control”,“correction” 或 “alternate” 其中之一的某个别名相等

在其他情况下程序非良构。

这些别名在 Unicode 字符数据库NameAliases.txt 列出。这些名字和别名都不会以空格开始或结束。

(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 起)

示例

#include <iostream>
 
int main()
{
    std::cout << "这\n\n一个\n测试\n\n";
    std::cout << "She said, \"Sells she seashells on the seashore?\"\n";
}

输出:

这
是
一个
测试
 
She said, "Sells she seashells on the seashore?"

缺陷报告

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

缺陷报告 应用于 出版时的行为 正确行为
CWG 505 C++98 当反斜杠后面的字符不是表格中指定的字符之一时,行为未定义 改为受条件性支持(此时语义由实现定义)

参阅