书籍:《ISO/IEC 14882 2014》
说明:以上内容大部分来自腾讯元宝。
如何理解以下内容:
1
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'
- 前缀作用:
前缀 类型 编码方式 示例 u
char16_t
UTF-16 u'\u4F60'
(汉字)U
char32_t
UTF-32 U'\U0001F600'
(😀)L
wchar_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_t | Unicode码点(如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字符串。 - 避免多字符字面量,以提高代码可移植性。
- 优先使用