名稱空間
變體
操作

轉義序列

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
 
 

轉義序列用於在字串字面量字元字面量中表示某些特殊字元。

以下轉義序列可用:

轉義
序列
描述 表示
簡單轉義序列
\' 單引號 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 起) 的成員,且它不是任何其他轉義序列中 \ 後面的字元。

目錄

[編輯] 通用字元名的範圍

如果通用字元名對應的碼點不是 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 等於其字元名或其“控制”、“修正”或“備用”型別的字元名別名之一,則它表示 Unicode 標準中對應的字元(第 4.8 章 名稱);否則,程式格式錯誤。

這些別名列在 Unicode 字元資料庫NameAliases.txt 中。這些名稱或別名都沒有前導或尾隨空格。

有效的 n-char-sequence 必須只包含大寫拉丁字母 A 到 Z、數字、空格和連字元。其他字元絕不會出現在 Unicode 字元名中,因此它們出現在 n-char-sequence 中總是會使程式格式錯誤。

(C++23 起)

[編輯] 備註

\0 是最常用的八進位制轉義序列,因為它表示以 null 結尾的字串中的終止 null 字元。

換行符 \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 起)

功能測試宏 標準 特性
__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 文件 關於 轉義序列