character constant
字符常量
句法
' c-char ' | (1) |
---|---|
u ' c-char ' (since C11) | (2) |
U ' c-char ' (since C11) | (3) |
L ' c-char ' | (4) |
' c-char-sequence ' | (5) |
如下:
- c-char为:
通用字符名称,\ u ...或\ U ...在转义序列中定义。 | (自C99以来) |
---|
- c-char-sequence is a sequence of two or more c-chars.
1)单字节整数字符常量,例如 'a'或'\ n'或'\ 13'。 这样的常量的类型为int,值等于执行字符集中c-char的表示,作为char类型映射到int的值。 如果c-char在执行字符集中不能表示为单个字节,则该值是实现定义的。
2)16位宽字符常量,例如 u'貓',但不是u'?'
(u'\U0001f34c'
)。 这种常量的类型为char16_t,值等于mbrtoc16(通常为UTF-16)生成的16位编码中的c-char的值。 如果c-char不可表示或映射到多个16位字符,则该行为是实现定义的。
3)32位宽的字符常数,例如U'貓'
或U'?'
。这种常量的类型char32_t
和值等于mbrtoc32
(通常为UTF-32)生成的32位编码中的c-char值。如果c-char不可表示或映射到多个32位字符,则该行为是实现定义的。
4)宽字符常量,例如L'β'
或L'貓
。这样的常量的类型wchar_t
和值等于执行宽字符集中c-char的值(即将生成的值mbtowc
)。如果c-char不可表示或映射到多个宽字符(例如,wchar_t
为16位的Windows上的非BMP值),则该行为是实现定义的。
5)多字符常量,例如'AB'
,具有类型int
和实现定义的值。
注意
多字符常量的许多实现使用常量中每个字符的值以big-endian顺序(例如'\1\2\3\4'
is 的值)初始化所得整数的连续字节0x01020304
。
在C ++中,普通字符常量具有类型char
,而不是int
。
与整型常量不同,如果char
被签名,则字符常量可能具有负值:在这样的实现上'\xFF'
有一个int
值为-1
。
当在#if或#elif的控制表达式中使用时,可以根据源字符集,执行字符集或某些其他实现定义的字符集来解释字符常量。
例
#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': %#010x\n", c1
int c2='🍌'; printf("'🍌': %#010x\n\n", c2 // implementation-defined
// multicharacter constant
int c3='ab'; printf("'ab': %#010x\n\n", c3 // implementation-defined
// 16-bit wide character constants
char16_t uc1 = u'a'; printf("'a': %#010x\n", (int)uc1
char16_t uc2 = u'¢'; printf("'¢': %#010x\n", (int)uc2
char16_t uc3 = u'猫'; printf("'猫': %#010x\n", (int)uc3
// implementation-defined (🍌 maps to two 16-bit characters)
char16_t uc4 = u'🍌'; printf("'🍌': %#010x\n\n", (int)uc4
// 32-bit wide character constants
char32_t Uc1 = U'a'; printf("'a': %#010x\n", (int)Uc1
char32_t Uc2 = U'¢'; printf("'¢': %#010x\n", (int)Uc2
char32_t Uc3 = U'猫'; printf("'猫': %#010x\n", (int)Uc3
char32_t Uc4 = U'🍌'; printf("'🍌': %#010x\n\n", (int)Uc4
// wide character constants
wchar_t wc1 = L'a'; printf("'a': %#010x\n", (int)wc1
wchar_t wc2 = L'¢'; printf("'¢': %#010x\n", (int)wc2
wchar_t wc3 = L'猫'; printf("'猫': %#010x\n", (int)wc3
wchar_t wc4 = L'🍌'; printf("'🍌': %#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
参考
- C11 standard (ISO/IEC 9899:2011):
- 6.4.4.4 Character constants (p: 67-70)
- C99 standard (ISO/IEC 9899:1999):
- 6.4.4.4 Character constants (p: 59-61)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.1.3.4 Character constants