转义序列

来自cppreference.com
< cpp‎ | language

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

下列转义序列可用:

转义序列 描述 表示
简单转义序列
\' 单引号 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
  1. 条件转义序列是条件性支持的。每个条件转义序列中的字符 c 均为基本源字符集中的成员,且不是任何其他转义序列中后随 \ 的字符。

通用字符名的范围

若通用字符名对应不是 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 起)

注解

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

换行符 \n 在用于文本模式 I/O 时有特殊含义:它被转换为特定于 OS 的换行符表示,通常是一个字节或字节序列。某些系统转而用长度字段标记其文本行。

八进制转义序列具有三个八进制位的长度限制,但若提前遇到不是合法八进制位的字符,则在首个这种字符处终止。

十六进制转义序列无长度限制,并在首个不是合法十六进制位的字符处终止。若单个十六进制转义序列所表示的值不适于此字符串字面量或字符常量中使用的字符类型(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 << "This\nis\na\ntest\n\nShe said, \"How are you?\"\n";
}

输出:

This
is
a
test
 
She said, "How are you?"

参阅