名稱空間
變體
操作

字元常量

來自 cppreference.com
< c‎ | 語言

目錄

[編輯] 語法

'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... 或八進位制轉義 \...,如轉義序列中所定義。
  • 通用字元名稱,\u...\U...,如轉義序列中所定義。
(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 中的規定實現多字元常量:常量中每個字元的值初始化結果整數的連續位元組,按照大端零填充右對齊的順序,例如 '\1' 的值是 0x00000001,而 '\1\2\3\4' 的值是 0x01020304

在 C++ 中,可編碼的普通字元字面量具有型別 char,而不是 int

整數常量不同,如果 char 是有符號的,則字元常量可以具有負值:在此類實現上,'\xFF' 是一個值為 -1int

當在 #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++ 文件,關於 字元字面量