2.14.3 Character literals 2

书籍:《ISO/IEC 14882 2014》

说明:以上内容大部分来自腾讯元宝。

如何理解以下内容:

A character literal is one or more characters enclosed in single quotes , as in ’x’, optionally preceded by one of the letters u , U , or L , as in u’y’ , U’z’ , or L’x’, respectively. A character literal that does not begin with u , U , or L is an ordinary character literal , also referred to as a narrow-character literal . An ordinary character literal that contains a single c-char representable in the execution character set has type char, with value equal to the numerical value of the encoding of the c-char in the execution character set. An ordinary character literal that contains more than one c-char is a multicharacter literal . A multicharacter literal, or an ordinary character literal containing a single c-char not representable in the execution character set, is conditionally-supported, has type int , and has an implementation-defined value .

字符字面量是用单引号括起来的一个或多个字符,如‘ x ’,前面可选地加上字母u、u或L中的一个,如u‘ y ’、U‘ z ’或L‘ x’。不以u、u或L开头的字符文字是普通字符文字,也称为窄字符文字。包含单个可在执行字符集中表示的c-char的普通字符字面量具有char类型,其值等于执行字符集中c-char编码的数值。包含一个以上c字符的普通字符字面量是多字符字面量。多字符字面量或包含单个在执行字符集中不可表示的c-char的普通字符字面量是有条件支持的,类型为int,并具有实现定义的值。 

 

一、基本结构与分类

1. ​​普通字符字面量(Narrow Character Literal)​
  • ​语法​​:'c-char-sequence'
    • ​示例​​:'a''\n''\x41'
    • ​类型​​:默认为 char,存储单个字符的编码值(如ASCII码)。
    • ​数值范围​​:由执行字符集(Execution Character Set)决定,通常为ASCII兼容的 char 类型(-128~127或0~255,取决于编译器符号性)。
2. ​​带前缀的宽字符字面量​
  • ​语法​​:u'y'U'z'L'x'
    • ​前缀作用​​:
      前缀类型编码方式示例
      uchar16_tUTF-16u'\u4F60'(汉字)
      Uchar32_tUTF-32U'\U0001F600'(😀)
      Lwchar_t宽字符(平台相关)L'Ω'(Unicode)
    • ​示例​​:
      char16_t c1 = u'你';    // UTF-16编码
      wchar_t c2 = L'©';      // 宽字符(通常4字节)
      char32_t c3 = U'\U0001F600'; // UTF-32编码

二、多字符字面量(Multicharacter Literal

1. ​​定义​
  • ​语法​​:'c1c2c3...'(包含多个字符
    • ​示例​​:'ab''\1\2\3'
    • ​类型​​:int(条件支持,由编译器决定
    • ​值​​:实现定义,通常将多个字符的编码按顺序组合为整数(如大端序或小端序)。
2. ​​示例与行为​
int a = 'AB';    // 可能为0x4142(十六进制)或0x4241,取决于编译器
int b = '\1\2\3'; // 可能为0x010203(八进制转义)
  • ​可移植性问题​​:不同编译器对多字符字面量的处理可能不同(如字节序、填充方式)。

三、字符的合法组成

1. ​​有效字符​
  • ​源字符集成员​​:除单引号(')、反斜杠(\)、换行符外的所有可打印字符
  • ​转义序列​​:
    • ​简单转义​​:\n(换行)、\\(反斜杠)、\'(单引号)等。
    • ​八进制转义​​:\101(十进制65 → 'A')。
    • ​十六进制转义​​:\x41(十进制65 → 'A')。
    • ​通用字符名​​:\u4F60(UTF-16编码的汉字“你”)。
2. ​​非法示例​
char c1 = '\x80';   // 可能溢出(char为有符号时值为-128)
char c2 = 'ab';     // 多字符字面量,类型为int

四、类型与值的规则

字面量类型类型值规则
普通单字符字面量char字符的编码值(如'A' → 65)
普通多字符字面量int实现定义(如'AB' → 0x4142或0x4241)
带前缀的宽字符字面量char16_t/wchar_t/char32_tUnicode码点(如u'\u4F60' → UTF-16编码的汉字“你”)

五、实际应用与注意事项

1. ​​字符编码与跨平台​
  • ​UTF-8支持​​:C++17引入u8前缀(如u8"你好"),但字符字面量仍需使用u/U/L前缀指定编码类型。
  • ​宽字符操作​​:使用wchar_t时需注意平台差异(Windows为2字节,Linux为4字节)。
2. ​​常见错误​
  • ​转义字符遗漏​​:
    char c = '\t';    // 正确:制表符
    char d = '\0';    // 正确:空字符
    char e = '\x';    // 错误:缺少十六进制数字
  • ​多字符字面量误用​​:
    char f = 'a';     // 正确:单字符
    int g = 'ab';     // 合法但值不确定(非可移植代码)


六、总结

  • ​核心规则​​:
    • 无前缀字符字面量默认为char多字符字面量为int
    • 前缀u/U/L指定Unicode编码类型,需匹配目标字符集。
  • ​设计意图​​:通过前缀和转义序列支持ASCII、扩展字符及Unicode,兼顾跨平台兼容性。
  • ​最佳实践​​:
    • 优先使用u8前缀处理UTF-8字符串。
    • 避免多字符字面量,以提高代码可移植性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值