首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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为:
    • 来自基本源字符集的字符减去单引号('),反斜线(\)或换行符。
    • 转义序列:转义序列中定义的特殊字符转义\' \" \? \\ \a \b \f \n \r \t \v,十六进制转义\x...或八进制转义\...之一。

通用字符名称,\ u ...或\ U ...在转义序列中定义。

(自C99以来)

代码语言:txt
复制
    -  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的控制表达式中使用时,可以根据源字符集,执行字符集或某些其他实现定义的字符集来解释字符常量。

代码语言:javascript
复制
#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);

可能的输出:

代码语言:javascript
复制
constant    value     
--------    ----------
'a':        0x00000061
'?':       0xf09f8d8c
?
'ab':       0x00006162
?
'a':        0x00000061
'?':        0x000000a2
'猫':       0x0000732b
'?':       0x0000df4c
?
'a':        0x00000061
'?':        0x000000a2
'猫':       0x0000732b
'?':       0x0001f34c
?
'a':        0x00000061
'?':        0x000000a2
'猫':       0x0000732b
'?':       0x0001f34c

参考

代码语言:txt
复制
    -  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 

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com