轉義序列
以下為可用的跳脫序列
| 跳脫 序列 |
描述 | 表示內容 |
|---|---|---|
| 簡單跳脫序列 | ||
\'
|
單引號 | 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 命名的字元(見下方) |
- ↑ 條件跳脫序列為「條件性支援」(conditionally-supported)。在每個條件跳脫序列中,字元
c是 基本來源字元集(C++23 前)基本字元集(C++23 起) 的成員,且非任何其他跳脫序列中緊接在\後方的字元。
目錄 |
[編輯] 通用字元名稱的範圍
|
如果通用字元名稱對應的代碼點不是 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 起) |
具名通用字元跳脫
上述語法的通用字元名稱稱為「具名通用字元」(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) | 具名通用字元跳脫 |
[編輯] 範例
輸出
This is a test She said, "Sells she seashells on the seashore?"
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| CWG 505 | C++98 | 若緊接在反斜線後的字元不在表中指定, 其行為曾為未定義 |
改為條件性支援 (語意由實作定義) |
[編輯] 參閱
| C 文件 關於 跳脫序列
|