admin 2026-02-13 18:05:10 节日专题

字符常量

C

编译器支持

语言

头文件

类型支持

程序工具

变参函数支持

错误处理

动态内存管理

字符串库

算法

数值

日期和时间工具

输入/输出支持

本地化支持

并发支持 (C11)

技术规范

符号索引

[编辑] C 语言

基本概念

关键词

预处理器

语句

表达式

初始化

声明

函数

杂项

C 的历史

技术规范

[编辑] 表达式

通用

值类别

求值顺序和序列点

常量表达式

隐式转换

泛型选择 (C11)

常量和字面量

整型常量

浮点常量

字符常量

真/假(C23)

nullptr(C23)

字符串字面量

复合字面量 (C99)

运算符

运算符优先级

成员访问和间接寻址

逻辑运算符

比较运算符

算术运算符

赋值运算符

增量和减量

函数调用、逗号、条件运算符

sizeof

_Alignof(C11*)

类型转换运算符

[编辑]

目录

1 语法

2 注意

3 示例

4 参考文献

5 另请参阅

[编辑] 语法

'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' 是一个值为 -1 的 int。

当在 #if 或 #elif 的控制表达式中使用时,字符常量可以根据源字符集、执行字符集或一些其他实现定义的字符集来解释。

16/32 位多字符常量未得到广泛支持,并在 C23 中移除。一些常见的实现(例如 clang)根本不接受它们。

[编辑] 示例

运行此代码

#include

#include

#include

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++ 文档,关于 字符字面量

Copyright © 2088 欢乐家园 - 休闲游戏活动与社交平台 All Rights Reserved.
友情链接