字符串字面量

来自cppreference.com
< cpp‎ | language
 
 
 
表达式
概述
值类别(左值 lvalue、右值 rvalue、亡值 xvalue)
求值顺序(序列点)
常量表达式
不求值表达式
初等表达式
lambda 表达式(C++11)
字面量
整数字面量
浮点字面量
布尔字面量
字符字面量,包含转义序列
字符串字面量
空指针字面量(C++11)
用户定义字面量(C++11)
运算符
赋值运算符a=ba+=ba-=ba*=ba/=ba%=ba&=ba|=ba^=ba<<=ba>>=b
自增与自减++a--aa++a--
算术运算符+a-aa+ba-ba*ba/ba%b~aa&ba|ba^ba<<ba>>b
逻辑运算符a||ba&&b!a
比较运算符a==ba!=ba<ba>ba<=ba>=b
成员访问运算符a[b]*a&aa->ba.ba->*ba.*b
其他运算符a(...)a,ba?b:c
运算符的替代表示形式
优先级和结合性
折叠表达式(C++17)
new 表达式
delete 表达式
throw 表达式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
运算符重载
类型转换
隐式转换
const_cast
static_cast
reinterpret_cast
dynamic_cast
显式转换 (T)aT(a)
用户定义转换
 

目录

[编辑] 语法

" (unescaped_character|escaped_character)* " (1)
L " (unescaped_character|escaped_character)* " (2)
u8 " (unescaped_character|escaped_character)* " (3) (C++11 起)
u " (unescaped_character|escaped_character)* " (4) (C++11 起)
U " (unescaped_character|escaped_character)* " (5) (C++11 起)
prefix(可选) R "delimiter( raw_characters )delimiter" (6) (C++11 起)

[编辑] 解释

unescaped_character - 任何合法字符,除了双引号 " 、反斜杠 \ 或换行符
escaped_character - 转义序列
prefix - Lu8uU 之一
delimiter - 括号、反斜杠和空格以外的任何源字符作成的字符序列(可为空,长度至多 16 个字符)
raw_characters - 任何字符序列,除了必须不含闭序列 )delimiter"


1) 窄多字节字符串字面量。无前缀字符串字面量的类型是 const char[]
2) 宽字符串字面量。 L"..." 字符串字面量的类型是 const wchar_t[]
3) UTF-8 编码的字符串字面量。 u8"..." 字符串字面量的类型是 const char[]
4) UTF-16 编码的字符串字面量。 u"..." 字符串字面量的类型是 const char16_t[]
5) UTF-32 编码的字符串字面量。 U"..." 字符串字面量的类型是 const char32_t[]
6) 生字符串字面量。用于避免转义任何字符。分隔符间的任何内容都成为字符串的一部分。 prefix 若存在则拥有与上述相同的含义。

[编辑] 注意

始终后附空字符( '\0'L'\0'char16_t() 等)到字符串字面量:从而字符串字面量 "Hello"const char[6] ,并保有字符 'H''e''l''l''o''\0'

毗邻的字符串字面量在翻译阶段 6 连接(在预处理器后)。即 "Hello,"  " world!" 生成(单个)字符串 "Hello, world!" 。若二个字符串拥有同一编码前缀(或无一拥有),则产生的字符串将拥有相同的编码前缀(或无前缀)。

若一个字符串有编码前缀而另一个无,则无编码前缀者被认为拥有与另一者相同的编码前缀。
L"Δx = %" PRId16 // 在阶段 4 , PRId16 展开成 "d"
                 // 在阶段 6 , L"Δx = %" 与 "d" 组成 L"Δx = %d"

若 UTF-8 字符串字面量与宽字符串字面量毗邻,则程序为病式。

(C++11 起)

实现可能或可能不支持任何其他编码前缀组合。这种连接的结果是实现定义的。

字符串字面量拥有静态存储期,从而在程序生存期间存在于内存中。

字符串字面量可用于初始化字符数组。若数组初始化类似 char str[] = "foo"; ,则 str 将含有字符串 "foo" 的副本。

允许,但不要求编译器结合相等或重叠的字符串字面量。这意味着以指针比较时,相同的字符串字面量可能或可能不比较相等。

bool b = "bar" == 3+"foobar" // 可为 true 或 false ,实现定义

试图修改字符串字面量导致未定义行为:它们可以存储于只读存储(例如 .rodata )或与其他字符串字面量结合:

const char* pc = "Hello";
char* p = const_cast<char*>(pc);
p[0] = 'M'; // 未定义行为

C 中,字符串字面量拥有类型 char[] ,而且可以直接赋值给(非 const ) char* 。 C++03 也曾允许(但将其设为过时,因为 C++ 中字面量是 const )。 C++11 不再允许不带转型的这种赋值。

字符串字面量不需要是一个 C 字符串:若字符串字面量有内嵌的空字符,则它表示含有多于一条字符串的数组。

const char* p = "abc\0def"; // std::strlen(p) == 3 ,但数组大小为 8

若字符串字面量中合法十六进制数位跟随一个十六进制转译,则因非法转译序列而编译失败。字符串连接可用作替代方案:

//const char* p = "\xfff"; // 错误:十六进制转义序列在范围外
const char* p = "\xff""f"; // OK :此字面量是保有 {'\xff','f','\0'} 的 const char[3]

窄多字节字符串字面量 (1) 与宽字符串字面量 (2) 的编码是实现定义的。例如, gcc 用命令行选项 -fexec-charset-fwide-exec-charset 选择它们.

[编辑] 示例

#include <iostream>
 
char array1[] = "Foo" "bar";
// 同
char array2[] = { 'F', 'o', 'o', 'b', 'a', 'r', '\0' };
 
const char* s1 = R"foo(
Hello
World
)foo";
// 同
const char* s2 = "\nHello\nWorld\n";
 
int main()
{
    std::cout << array1 << '\n';
    std::cout << array2 << '\n';
 
    std::cout << s1;
    std::cout << s2;
}

输出:

Foobar
Foobar
 
Hello
World
 
Hello
World

[编辑] 参阅

字符串字面量C 文档