转义序列用于在字符串字面量和字符字面量中表示某些特殊字符。
可以使用下列转义序列:
| 转义序列 |
描述 |
表示 |
| 简单转义序列 |
\' |
单引号 |
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 起) |
ISO/IEC 10646 中列出的任意字符 |
以 name 命名的字符(见下文) |
- ↑ 条件转义序列受条件性支持。每个条件转义序列中的字符
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字符序列 等于以下之一时会对应一个按此命名的字符:
- ISO/IEC 10646 的 “Code charts and lists of character names” 小节中指定的关联字符名或关联字符别名
- 下面给出的控制代码别名
关联字符名,关联字符别名以及控制代码别名不会以空格开始或结束。
| 代码单元 |
控制代码别名 |
代码单元 |
控制代码别名 |
| U+0000 |
NULL |
U+007F |
DELETE |
| U+0001 |
START OF HEADING |
U+0082 |
BREAK PERMITTED HERE |
| U+0002 |
START OF TEXT |
U+0083 |
NO BREAK HERE |
| U+0003 |
END OF TEXT |
U+0084 |
INDEX |
| U+0004 |
END OF TRANSMISSION |
U+0085 |
NEXT LINE |
| U+0005 |
ENQUIRY |
U+0086 |
START OF SELECTED AREA |
| U+0006 |
ACKNOWLEDGE |
U+0087 |
END OF SELECTED AREA |
| U+0007 |
ALERT |
U+0088 |
CHARACTER TABULATION SET |
| U+0008 |
BACKSPACE |
HORIZONTAL TABULATION SET |
| U+0009 |
CHARACTER TABULATION |
U+0089 |
CHARACTER TABULATION WITH JUSTIFICATION |
| HORIZONTAL TABULATION |
HORIZONTAL TABULATION WITH JUSTIFICATION |
| U+000A |
LINE FEED |
U+008A |
LINE TABULATION SET |
| NEW LINE |
VERTICAL TABULATION SET |
| END OF LINE |
U+008B |
PARTIAL LINE FORWARD |
| U+000B |
LINE TABULATION |
PARTIAL LINE DOWN |
| VERTICAL TABULATION |
U+008C |
PARTIAL LINE BACKWARD |
| U+000C |
FORM FEED |
PARTIAL LINE UP |
| U+000D |
CARRIAGE RETURN |
U+008D |
REVERSE LINE FEED |
| U+000E |
SHIFT OUT |
REVERSE INDEX |
| LOCKING-SHIFT ONE |
U+008E |
SINGLE SHIFT TWO |
| U+000F |
SHIFT IN |
SINGLE-SHIFT-2 |
| LOCKING-SHIFT ZERO |
U+008F |
SINGLE SHIFT THREE |
| U+0010 |
DATA LINK ESCAPE |
SINGLE-SHIFT-3 |
| U+0011 |
DEVICE CONTROL ONE |
U+0090 |
DEVICE CONTROL STRING |
| U+0012 |
DEVICE CONTROL TWO |
U+0091 |
PRIVATE USE ONE |
| U+0013 |
DEVICE CONTROL THREE |
PRIVATE USE-1 |
| U+0014 |
DEVICE CONTROL FOUR |
U+0092 |
PRIVATE USE TWO |
| U+0015 |
NEGATIVE ACKNOWLEDGE |
PRIVATE USE-2 |
| U+0016 |
SYNCHRONOUS IDLE |
U+0093 |
SET TRANSMIT STATE |
| U+0017 |
END OF TRANSMISSION BLOCK |
U+0094 |
CANCEL CHARACTER |
| U+0018 |
CANCEL |
U+0095 |
MESSAGE WAITING |
| U+0019 |
END OF MEDIUM |
U+0096 |
START OF GUARDED AREA |
| U+001A |
SUBSTITUTE |
START OF PROTECTED AREA |
| U+001B |
ESCAPE |
U+0097 |
END OF GUARDED AREA |
| U+001C |
INFORMATION SEPARATOR FOUR |
END OF PROTECTED AREA |
| FILE SEPARATOR |
U+0098 |
START OF STRING |
| U+001D |
INFORMATION SEPARATOR THREE |
U+009A |
SINGLE CHARACTER INTRODUCER |
| GROUP SEPARATOR |
U+009B |
CONTROL SEQUENCE INTRODUCER |
| U+001E |
INFORMATION SEPARATOR TWO |
U+009C |
STRING TERMINATOR |
| RECORD SEPARATOR |
U+009D |
OPERATING SYSTEM COMMAND |
| U+001F |
INFORMATION SEPARATOR ONE |
U+009E |
PRIVACY MESSAGE |
| UNIT SEPARATOR |
U+009F |
APPLICATION PROGRAM COMMAND |
|
(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)。
|
(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 |
当反斜杠后面的字符不是表格中指定的字符之一时,行为未定义 |
改为受条件性支持(此时语义由实现定义) |
参阅