转义序列
可以使用下列转义序列:
转义序列 | 描述 | 表示 |
---|---|---|
简单转义序列 | ||
\'
|
单引号 | 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
|
\xnn
|
任意十六进制值 | 字节 nn
|
条件转义序列[1] | ||
\c
|
实现定义 | 实现定义 |
通用字符名 | ||
\unnnn
|
任意 Unicode 值: 可能生成多个编码单元 |
编码点 U+nnnn
|
\Unnnnnnnn
|
任意 Unicode 值: 可能生成多个编码单元 |
编码点 U+nnnnnnnn
|
通用字符名的范围
如果有一个通用字符名对应了一个小于 0xA0 且不是 0x24 ( |
(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 起) |
注解
\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\nShe said, \"Sells she seashells on the seashore?\"\n"; }
输出:
这 是 一个 测试 She said, "Sells she seashells on the seashore?"