字元常數
出自 cppreference.com
目錄 |
[編輯] 語法
'c-char ' |
(1) | ||||||||
u8'c-char ' |
(2) | (C23 起) | |||||||
u'c-char ' |
(3) | (自 C11 起) | |||||||
U'c-char ' |
(4) | (自 C11 起) | |||||||
L'c-char ' |
(5) | ||||||||
'c-char-sequence ' |
(6) | ||||||||
L'c-char-sequence ' |
(7) | ||||||||
u'c-char-sequence ' |
(8) | (C11 起)(C23 移除) | |||||||
U'c-char-sequence ' |
(9) | (C11 起)(C23 移除) | |||||||
其中
- c-char 為下列兩者之一:
- 基本原始字元集中的字元,但不包含單引號 (
')、反斜線 (\) 或換行字元。 - 跳脫序列:下列特殊字元跳脫序列之一 \' \" \? \\ \a \b \f \n \r \t \v,十六進位跳脫 \x... 或八進位跳脫 \...,定義於 跳脫序列。
- 基本原始字元集中的字元,但不包含單引號 (
|
(自 C99 起) |
- c-char-sequence 為兩個或多個 c-char 的序列。
1) 單一位元組整數字元常數,例如 'a' 或 '\n' 或 '\13'。此類常數具有 int 型別,且其值等於 c-char 在執行字元集中作為 char 型別映射至 int 的值。若 c-char 無法在執行字元集中以單一位元組表示,則該值由實作定義。
2) UTF-8 字元常數,例如 u8'a'。此類常數具有 char8_t 型別,且其值等於 c-char 的 ISO 10646 碼點值,前提是該碼點值能以單一 UTF-8 碼元表示(即 c-char 在 0x0-0x7F 範圍內)。若 c-char 無法以單一 UTF-8 碼元表示,則程式格式錯誤。
|
3) 16 位元寬字元常數,例如 u'貓',但不含 u'🍌' (u'\U0001f34c')。此類常數具有 char16_t 型別,且其值等於 c-char 在 mbrtoc16 所產生的 16 位元編碼(通常為 UTF-16)中的值。若 c-char 無法表示或映射至多於一個 16 位元字元,則該值由實作定義。
4) 32 位元寬字元常數,例如 U'貓' 或 U'🍌'。此類常數具有 char32_t 型別,且其值等於 c-char 在 mbrtoc32 所產生的 32 位元編碼(通常為 UTF-32)中的值。若 c-char 無法表示或映射至多於一個 32 位元字元,則該值由實作定義。 |
(C23 之前) |
|
3) UTF-16 字元常數,例如 u'貓',但不含 u'🍌' (u'\U0001f34c')。此類常數具有 char16_t 型別,且其值等於 c-char 的 ISO 10646 碼點值,前提是該碼點值能以單一 UTF-16 碼元表示(即 c-char 在 0x0-0xD7FF 或 0xE000-0xFFFF 範圍內)。若 c-char 無法以單一 UTF-16 碼元表示,則程式格式錯誤。
4) UTF-32 字元常數,例如 U'貓' 或 U'🍌'。此類常數具有 char32_t 型別,且其值等於 c-char 的 ISO 10646 碼點值,前提是該碼點值能以單一 UTF-32 碼元表示(即 c-char 在 0x0-0xD7FF 或 0xE000-0x10FFFF 範圍內)。若 c-char 無法以單一 UTF-32 碼元表示,則程式格式錯誤。 |
(C23 起) |
5) 寬字元常數,例如 L'β' 或 L'貓'。此類常數具有 wchar_t 型別,且其值等於 c-char 在執行寬字元集中的值(即由 mbtowc 所產生的值)。若 c-char 無法表示或映射至多於一個寬字元(例如在 Windows 上,當 wchar_t 為 16 位元時的非 BMP 值),則該值由實作定義。
6) 多字元常數,例如 'AB',具有 int 型別,其值由實作定義。
7) 寬多字元常數,例如 L'AB',具有 wchar_t 型別,其值由實作定義。
8) 16 位元多字元常數,例如 u'CD',具有 char16_t 型別,其值由實作定義。
9) 32 位元多字元常數,例如 U'XY',具有 char32_t 型別,其值由實作定義。
[編輯] 附註
多字元常數是 C 從 B 程式語言中繼承而來的。雖然 C 標準並未具體規定,但大多數編譯器(MSVC 為顯著的例外)皆按照 B 語言中的定義來實作多字元常數:常數中每個 char 的值會初始化結果整數的連續位元組,採用大端序 (big-endian)、補零、右對齊的順序。例如 '\1' 的值為 0x00000001,而 '\1\2\3\4' 的值為 0x01020304。
在 C++ 中,可編碼的一般字元實字具有 char 型別,而非 int。
與 整數常數 不同,若 char 為帶符號(signed),字元常數可能具有負值:在此類實作中,'\xFF' 是一個值為 -1 的 int。
當在 #if 或 #elif 的控制表達式中使用時,字元常數可能會根據原始字元集、執行字元集或其他實作定義的字元集進行解釋。
16/32 位元多字元常數未被廣泛支援,並已在 C23 中移除。某些常見的實作(如 clang)完全不接受它們。
[編輯] 範例
執行此程式碼
#include <stddef.h> #include <stdio.h> #include <uchar.h> int main (void) { printf("constant value \n"); printf("-------- ----------\n"); // integer character constants, int c1='a'; printf("'a':\t %#010x\n", c1); int c2='🍌'; printf("'🍌':\t %#010x\n\n", c2); // implementation-defined // multicharacter constant int c3='ab'; printf("'ab':\t %#010x\n\n", c3); // implementation-defined // 16-bit wide character constants char16_t uc1 = u'a'; printf("'a':\t %#010x\n", (int)uc1); char16_t uc2 = u'¢'; printf("'¢':\t %#010x\n", (int)uc2); char16_t uc3 = u'猫'; printf("'猫':\t %#010x\n", (int)uc3); // implementation-defined (🍌 maps to two 16-bit characters) char16_t uc4 = u'🍌'; printf("'🍌':\t %#010x\n\n", (int)uc4); // 32-bit wide character constants char32_t Uc1 = U'a'; printf("'a':\t %#010x\n", (int)Uc1); char32_t Uc2 = U'¢'; printf("'¢':\t %#010x\n", (int)Uc2); char32_t Uc3 = U'猫'; printf("'猫':\t %#010x\n", (int)Uc3); char32_t Uc4 = U'🍌'; printf("'🍌':\t %#010x\n\n", (int)Uc4); // wide character constants wchar_t wc1 = L'a'; printf("'a':\t %#010x\n", (int)wc1); wchar_t wc2 = L'¢'; printf("'¢':\t %#010x\n", (int)wc2); wchar_t wc3 = L'猫'; printf("'猫':\t %#010x\n", (int)wc3); wchar_t wc4 = L'🍌'; printf("'🍌':\t %#010x\n\n", (int)wc4); }
可能輸出
constant value -------- ---------- 'a': 0x00000061 '🍌': 0xf09f8d8c 'ab': 0x00006162 'a': 0x00000061 '¢': 0x000000a2 '猫': 0x0000732b '🍌': 0x0000df4c 'a': 0x00000061 '¢': 0x000000a2 '猫': 0x0000732b '🍌': 0x0001f34c 'a': 0x00000061 '¢': 0x000000a2 '猫': 0x0000732b '🍌': 0x0001f34c
[編輯] 參考文獻
- C17 標準 (ISO/IEC 9899:2018)
- 6.4.4.4 字元常數 (p: 48-50)
- C11 標準 (ISO/IEC 9899:2011)
- 6.4.4.4 字元常數 (p: 67-70)
- C99 標準 (ISO/IEC 9899:1999)
- 6.4.4.4 字元常數 (p: 59-61)
- C89/C90 標準 (ISO/IEC 9899:1990)
- 3.1.3.4 字元常數
[編輯] 參見
| C++ 文件 關於 字元實字
|