字符串字面值

字符串文字 包含以双引号符号括起的字符序列或转义序列。 前缀为 L 的字符串文字是 宽字符串文字。 不带前缀 L 的字符串文字是 普通窄字符串文字

仅限 C窄字符串字面量的类型是 char 的数组。 宽字符串类型的数组是 wchar_t 仅限 C 结束

仅限 C + + 开始 窄字符串字面量的类型是 的数组。 const char 宽字符串文字的类型是 const wchar_t的数组。 两种类型都具有静态存储持续时间。仅限 C++ 结束

字符串字面值语法

读取语法图跳过可视语法图 L " 字符转义序列 "

将保留字符串文字中包含的多个空格。

使用转义序列 \n 将换行符表示为字符串的一部分。 使用转义序列 \\ 将反斜杠字符表示为字符串的一部分。 您可以单独表示单引号符号,也可以使用转义序列 \'表示单引号符号。 必须使用转义序列 \" 来表示双引号。

在基本源字符集之外,允许字母和数字的通用字符名称 在 C++ 和 中处于 C99 语言级别。 仅限 C + +在C++中,必须使用 -qlanglvl=ucs 选项进行编译,以支持通用字符名称。仅限 C++ 结束

IBM 扩展开始 当您使用 -qmacpstr 选项编译时,也接受字符串字面量的Pascal字符串形式。IBM 扩展结束

请参阅以下字符串文字示例:
char titles[ ] = "Handel's \"Water Music\""; 
char *temp_string = "abc" "def" "ghi";    // *temp_string = "abcdefghi\0" 
wchar_t *wide_string = L"longstring";

此示例说明字符串字面值中的转义序列:

#include <iostream> using namespace std;

int main () {
       char *s ="Hi there! \n";       
    		cout << s;
       char *p = "The backslash character \\.";
       cout << p << endl;
       char *q = "The double quotation mark \".\n";
       cout << q ;
 }  
此程序生成以下输出:
Hi there! The backslash character \. The double quotation mark ".
要在下一行上继续字符串,请使用后跟可选空格和换行符 (必需) 的行连续字符 (\ 符号)。 例如:
char *mail_addr = "Last Name    First Name    MI   Street Address \
       893    City     Province   Postal code ";
注: 当字符串文字在程序源中多次出现时,该字符串的存储方式取决于字符串是只读的还是可写的。 缺省情况下,编译器将字符串视为只读。 XL C/C++ 可能仅为只读字符串分配一个位置; 所有出现都引用该位置。 但是,该存储区域可能受到写保护。 如果字符串是可写的,那么每次出现的字符串都有一个始终可修改的单独的不同存储位置。 可以使用 #pragma strings 伪指令或 -qro 编译器选项来更改字符串文字的缺省存储器。

字符串并置

继续字符串的另一种方法是具有两个或更多个连续字符串。 可以并置相邻字符串字面值以生成单个字符串。 例如:
"hello " "there"    //equivalent to "hello there" 
"hello" "there"     //equivalent to "hellothere"

并置字符串中的字符保持不同。 例如,将字符串 "\xab""3" 并置以形成 "\xab3"。 但是,字符 \xab3 保持不同,并且不会合并以形成十六进制字符 \xab3

如果宽字符串文字和窄字符串文字相邻,如以下示例中所示:
"hello " L"there"   
结果是一个宽字符串字面值。
备注C 仅开始在 C99 中,窄字符串可以与宽字符串字面值连接。仅限 C 结束 C++11 开始在 C++11 中, C99 预处理器对字符串连接进行了修改,为C和C++编译器提供了一个通用的预处理器接口。 窄字符串可以与 C++11中的宽字符串字面值并置。 欲了解更多信息,请参阅 C++11 ( C++11 )中采用的 C99 预处理器功能C++11 结束
在任何并置之后,'\0'类型为 char 的字符串将追加到每个字符串的末尾。 对于宽字符串文字,'\0'将追加类型为 wchar_t 的值。 根据约定,程序通过查找空字符来识别字符串的结尾。 例如:
char *first = "Hello ";            //stored as "Hello \0"
char *second = "there";            //stored as "there\0"
char *third = "Hello " "there";    //stored as "Hello there\0"