字符串字面量

C++标准规定,字符串字面量的类型为“n个const char的数组”。

修改字符串字面量会怎么样?

答案:未定义行为。

#include <iostream>

int main() {
    char* str{"hello world!"};  // 将字符串字面量赋值给 char* 类型变量
    str[0] = 'g';  // 未定义行为

    return 0;
}

gcc13.2,上述程序在编译过程中给出警告,运行程序出错。

编译过程中的警告信息:

<source>: In function 'int main()':
<source>:4:15: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    4 |     char* str{"hello world!"};  // 将字符串字面量赋值给 char* 类型变量
      |               ^~~~~~~~~~~~~~
ASM generation compiler returned: 0
<source>: In function 'int main()':
<source>:4:15: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    4 |     char* str{"hello world!"};  // 将字符串字面量赋值给 char* 类型变量
      |               ^~~~~~~~~~~~~~
Execution build compiler returned: 0

程序运行出错信息:

Program returned: 139
Program terminated with signal: SIGSEGV

相关解释:

当程序以信号 SIGSEGV 终止时,意味着程序试图访问未分配给它的内存,或者试图访问一个不属于它的内存地址。

SIGSEGV 是“Segmentation Violation”的缩写,是指“段错误”(Segmentation Fault),表明程序访问了无效的内存地址。

原始字符串字面量

是什么?为什么?怎么用?

原始字符串字面量是可以跨越多行代码的字面量,不需要转义嵌入的双引号,并且会将\t\n这样的文本看成普通文本,而不是解释成转移序列。

#include <iostream>

int main() {
    {
        // 字符串字面量 和 原始字符串字面量 对比

        // 双引号
        std::cout << "hello, my name is \"Aoyu\"." << std::endl;
        std::cout << R"(hello, my name is "Aoyu".)" << std::endl;

        // 转义序列
        std::cout << "hello,\nworld!" << std::endl;
        std::cout << R"(hello,\nworld!)" << std::endl;
        std::cout << R"(hello,
world!)" << std::endl;
    }

    {
        // 由于 原始字符串字面量 以 )" 结尾,所以无法在字符串中包含 )"
        // 解决办法:使用扩展的原始字符串字面量语法(extended raw string literal syntax)
        std::cout << R"==("Person(Aoyu)")==" << std::endl;
        std::cout << R"-("Person(Aoyu)")-" << std::endl;
        // 上面在()两侧的 == 或 -,称为 定界序列 delimiter sequence
        // 可以任意选择,只要没在字符串中出现就可以,最长可以有 16 个字符
    }

    return 0;
}

std::string 字符串字面量

C++风格字符串,std:string 类

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注