字符常量
来自 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,值为实现定义的。
[编辑] 注释
多字符常量是从 B 编程语言继承来的。虽然 C 标准没有指定,但大多数编译器(MSVC 是一个显着的例外)都按 B 中的规范实现多字符常量:常量中每个 char 的值都将初始化结果整数的连续字节,以大端序零填充、右对齐的顺序,例如,'\1' 的值为 0x00000001,而 '\1\2\3\4' 的值为 0x01020304。
在 C++ 中,可编码的普通字符字面量的类型为 char,而不是 int。
与 整数常量 不同,如果 char 有符号,则字符常量可能具有负值:在这些实现中,'\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++ 文档 for 字符字面量
|