命名空間
變體
動作

轉義序列

出自 cppreference.com
< cpp‎ | language
 
 
C++ 語言
一般主題
關鍵字
轉義序列
流程控制
條件執行陳述式
if
疊代陳述式 (迴圈)
for
範圍 for (C++11)
跳躍陳述式
函式
函式宣告
Lambda 函式運算式
inline 指定符
動態例外規範 (直到 C++17*)
noexcept 指定符 (C++11)
例外
命名空間
型別
指定符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
儲存期指定符
初始化
 
 

跳脫序列用於表示字串實值字元實值中的特定特殊字元。

以下為可用的跳脫序列

跳脫
序列
描述 表示內容
簡單跳脫序列
\' 單引號 ASCII 編碼中的位元組 0x27
\" 雙引號 ASCII 編碼中的位元組 0x22
\? 問號 ASCII 編碼中的位元組 0x3f
\\ 反斜線 ASCII 編碼中的位元組 0x5c
\a 響鈴(audible bell) ASCII 編碼中的位元組 0x07
\b 退格(backspace) ASCII 編碼中的位元組 0x08
\f 換頁(form feed) ASCII 編碼中的位元組 0x0c
\n 換行(line feed) ASCII 編碼中的位元組 0x0a
\r 回車符 (carriage return) ASCII 編碼中的位元組 0x0d
\t 水平定位符 (horizontal tab) ASCII 編碼中的位元組 0x09
\v 垂直定位符 (vertical tab) 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. 條件跳脫序列為「條件性支援」(conditionally-supported)。在每個條件跳脫序列中,字元 c基本來源字元集(C++23 前)基本字元集(C++23 起) 的成員,且非任何其他跳脫序列中緊接在 \ 後方的字元。

目錄

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

如果通用字元名稱對應的代碼點不是 0x24 ($)、0x40 (@) 或 0x60 (`) 且小於 0xA0,則程式編譯錯誤(ill-formed)。換句話說,基本來源字元集的成員與控制字元(在 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-序列 }
n-char-序列 - 一個或多個 n-char
n-char - 來自翻譯字元集的字元,右大括號 } 或換行字元除外

上述語法的通用字元名稱稱為「具名通用字元」(named universal character)。若 n-char-序列 等於其字元名稱,或等於其類型為「control」、「correction」或「alternate」的字元名稱別名之一,則它會指定 Unicode 標準第 4.8 章名稱)中的對應字元;否則,程式編譯錯誤。

這些別名列於 Unicode 字元資料庫NameAliases.txt 中。這些名稱或別名均無開頭或結尾空格。

合法的 n-char-序列 必須僅包含大寫拉丁字母 A 至 Z、數字、空格與連字號。Unicode 字元名稱中絕不包含其他字元,因此若出現在 n-char-序列 中,將永遠導致程式編譯錯誤。

(自 C++23 起)

[編輯] 註解

\0 是最常用的八進位跳脫序列,因為它在空字元終止字串中表示終止的空字元(null character)。

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

問號跳脫序列 \? 用於防止三元碼(trigraphs)在字串實值內被解讀:例如 "??/" 這類字串會被編譯為 "\",但如果第二個問號被跳脫,如 "?\?/",則變為 "??/"由於三元碼已從 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++ 標準。

DR 應用於 出版時的行為 正確的行為
CWG 505 C++98 若緊接在反斜線後的字元不在表中指定,
其行為曾為未定義
改為條件性支援
(語意由實作定義)

[編輯] 參閱

C 文件 關於 跳脫序列
English Deutsch 日本語 한국어 中文(简体) 中文(繁體)