语法

' c-字符 ' (1)
u8' c-字符 ' (2) (C++17 起)
u' c-字符 ' (3) (C++11 起)
U' c-字符 ' (4) (C++11 起)
L' c-字符 ' (5)
' c-字符序列 ' (6)

其中

  • c-字符 为下列之一
    • 来自源字符集去掉单引号(')、反斜杠(\)和换行符后的字符,
    • 转义序列,按转义序列中所定义
    • 通用字符名,按转义序列中所定义
  • c-字符序列 是两个或更多个 c-字符。

1) 窄字符字面量或普通字符字面量,例如 'a' 或 '\n' 或 '\13'。这种字面量具有 char 类型,且其值等于 c-字符 在执行字符集中的表示。若 c-字符 在执行字符集中无法以单字节表示,则字面量具有 int 类型和实现定义的值。

2) UTF-8 字符字面量,例如 u8'a'。这种字面量具有 char (C++20 前)char8_t (C++20 起) 类型,且其值等于 c-字符 的 ISO 10646 码位值,只要码位值能以单个 UTF-8 编码单元表示(即 c-字符 处于范围 0x0-0x7F(含边界)内)。若 c-字符 不能以单个 UTF-8 编码单元表示,则程序非良构。

3) UTF-16 字符字面量,例如 u'字',但不是 u'🍌'(u'\U0001f34c')。这种字面量具有 char16_t 类型,且其值等于 c-字符 的 ISO 10646 码位值,只要该值能以单个 UTF-16 编码单元表示(即 c-字符 处于范围 0x0-0xFFFF(含边界)内)。若 c-字符 不能以单个 UTF-16 编码单元表示,则程序非良构。

4) UTF-32 字符字面量,例如 U'字' 或 U'🍌'。这种字面量具有 char32_t 类型,且其值等于 c-字符 的 ISO 10646 码位值。

5) 宽字符字面量,例如 L'β' 或 L'字'。这种字面量具有 wchar_t 类型,且其值等于 c-字符 在执行宽字符集中的值。若 c-字符 在执行宽字符集中无法表示(例如在 wchar_t 为 16 位的 Windows 上的非 BMP 值),则字面量的值是实现定义的。

6) 多字符字面量,例如 'AB',具有 int 类型和实现定义的值。

注解

多字符字面量是 C 从 B 编程语言继承而来的。尽管 C 或 C++ 标准不指定,大多数编译器(值得注意的例外是 MSVC )也如 B 中所指定实现多字符字面量:字面量中的每个字符的值以大端序零填充右对齐顺序初始化结果整数的相继字节,例如 '\1' 的值为 0x00000001 而 '\1\2\3\4' 的值为 0x01020304 。

C 中,诸如 'a' 或 '\n' 之类的字符常量具有 int 类型,而非 char。