命名空间
变体
操作

字符常量

来自 cppreference.cn
< 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 在执行字符集中的表示,作为映射到 intchar 类型的值。如果 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-charmbrtoc16 生成的 16 位编码中的值(通常为 UTF-16)。如果 c-char 无法表示或映射到多个 16 位字符,则该值是实现定义的。
4) 32 位宽字符常量,例如 U'貓'U'🍌'。此类常量具有类型 char32_t,其值等于 c-charmbrtoc32 生成的 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++ 文档 关于 字符字面量