1、C 和 C++ 中的字符串字面量
在 C 和 C++ 中,字符串字面量是由双引号括起来的字符序列,例如 "Hello"
。它们表示一个常量字符数组,并且字符串字面量的类型取决于语言和上下文。
1)C 中的字符串字面量
#include <stdio.h> int main() { // 定义字符串字面量 char str[] = "Hello, World!"; // 输出字符串 printf("%s\n", str); // 输出字符串字面量直接使用 printf("This is a string literal: %s\n", "C Programming"); return 0; }
2)C++ 中的字符串字面量
#include <iostream> #include <string> using namespace std; int main() { // 使用 C 风格字符串字面量 const char* str1 = "Hello, World!"; cout << str1 << endl; // 使用 C++ 风格字符串字面量 (std::string) string str2 = "C++ Programming"; cout << str2 << endl; // 字符串字面量的直接使用 cout << "This is a string literal in C++: " << "Learning C++" << endl; return 0; }
2、C 中的字符串字面量类型
在 C 中,像 "Hello"
这样的字符串字面量的类型是char[]
,但当你在表达式中使用它时,它被当作一个指向数组第一个字符的 指针 来处理。具体来说,它的类型是 char*
。需要注意的是,字符串字面量本身是 不可变的(即编译器通常将字符串字面量存储在只读内存中),但它指向它的指针在 C 中并不是 const
。
#include <stdio.h> int main() { // 字符串字面量 const char *str1 = "Hello, World!"; // 字符串字面量赋值给指针 const char str2[] = "Hello, World!"; // 字符串字面量赋值给字符数组 printf("str1: %s\n", str1); // 打印指针指向的字符串 printf("str2: %s\n", str2); // 打印字符数组中的字符串 // 访问字符串字面量的单个字符 printf("First character of str1: %c\n", str1[0]); // 'H' printf("First character of str2: %c\n", str2[0]); // 'H' // 注意:不能修改字符串字面量 // str1[0] = 'h'; // 错误:字符串字面量是常量 return 0; }
3、C++ 中的字符串字面量类型
在 C++ 中,字符串字面量的类型是 const char[]
。也就是 C++ 中的字符串字面量是常量字符数组。当作为表达式使用时,C++ 中的字符串字面量表现得像是 const char*
(指向常量字符的指针)。也就是在 C++ 中,指针是常量的,你不能直接修改字符串字面量。
#include <iostream> using namespace std; int main() { // 普通字符串字面量 const char* str1 = "Hello, World!"; cout << "str1: " << str1 << endl; // 宽字符字符串字面量 const wchar_t* str2 = L"Hello, Wide World!"; wcout << L"str2: " << str2 << endl; // UTF-8 字符串字面量 const char* str3 = u8"Hello, UTF-8 World!"; cout << "str3: " << str3 << endl; // UTF-16 字符串字面量 const char16_t* str4 = u"Hello, UTF-16 World!"; wcout << L"str4: " << str4 << endl; // UTF-32 字符串字面量 const char32_t* str5 = U"Hello, UTF-32 World!"; wcout << L"str5: " << str5 << endl; // 原始字符串字面量 (无需转义的字符串) const char* str6 = R"(This is a "raw" string literal)"; cout << "str6: " << str6 << endl; return 0; }
4、C++ 中是 const 而 C 中不是的原因
在 C 中,字符串字面量不会自动视为常量,可以在使用它们时有一些灵活性(尽管修改它们是未定义行为)。在 C++ 中,语言要求字符串字面量视为 const
,因为修改它们是未定义行为,编译器假定字符串字面量是只读的。
1)在 C 中
#include <stdio.h> int main() { // C 中字符串字面量不是 const char* str1 = "Hello, World!"; // 字符串字面量类型是 char* // 虽然这里不推荐,但 C 中可以修改字符串字面量 str1[0] = 'h'; // 未定义行为,虽然可以编译,但这样做会导致程序崩溃 printf("str1: %s\n", str1); return 0; }
2)在 C++ 中
#include <iostream> using namespace std; int main() { // C++ 中字符串字面量是常量 const char* str1 = "Hello, World!"; // 字符串字面量类型是 const char* // str1[0] = 'h'; // 错误:尝试修改字符串字面量,编译错误 std::cout << "str1: " << str1 << std::endl; return 0; }