C 和 C++ 中,字符串字面量的类型通常是 const char[],但 C++ 支持多种字符集的字面量类型,如 const wchar_t[]、const char8_t[]、const char16_t[] 和 const char32_t[]。字符串字面量是常量,无法修改其内容,但可以将其复制到非 const 字符数组中进行修改。

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;
}

推荐文档