C++11新特性1.原始字面量

发布于:2025-03-08 ⋅ 阅读:(131) ⋅ 点赞:(0)

目录

一.简介

1.基本概念

2.语法

二.示例代码

示例 1:简单的原始字面量

示例 2:使用定界符

示例 3:多行原始字面量


一.简介

1.基本概念

        在传统的 C++ 字符串字面量中,反斜杠 \ 被用作转义字符,用于表示一些特殊字符,如换行符 \n、制表符 \t 等。但当字符串中本身包含大量反斜杠或引号时,需要对这些字符进行转义,这会使字符串的书写变得复杂且难以阅读。原始字面量的出现就是为了解决这个问题,它允许你直接书写字符串,而无需对特殊字符进行转义。  

2.语法

R"delimiter(原始字符串内容)delimiter"

R:这是原始字面量的标识符,用于告诉编译器这是一个原始字符串字面量。

delimiter:这是一个可选的定界符,由最多 16 个基本字符(字母、数字、标点符号等)组成,用于标记原始字符串的开始和结束。定界符在开始和结束处必须保持一致。如果不指定定界符,默认使用空定界符。

(原始字符串内容):这是实际的字符串内容,其中可以包含任意字符,包括反斜杠和引号,无需进行转义。

二.示例代码

示例 1:简单的原始字面量

#include <iostream>
#include <string>

int main() {
    // 传统字符串字面量,需要对反斜杠和引号进行转义
    std::string traditional = "Hello, \"World!\"\\n";
    // 原始字符串字面量,无需转义
    std::string raw = R"(Hello, "World!"\n)";

    std::cout << "Traditional: " << traditional << std::endl;
    std::cout << "Raw: " << raw << std::endl;

    return 0;
}

在这个示例中,传统字符串字面量 traditional 需要对引号和反斜杠进行转义,而原始字符串字面量 raw 可以直接书写,无需转义。 

运行结果:

Traditional: Hello, "World!"\n
Raw: Hello, "World!"\n

示例 2:使用定界符

使用定界符原因:

在原始字符串字面量的基本语法 R"(原始字符串内容)" 里,字符串内容是用 ( 和 ) 括起来的。当字符串内容本身包含 ) 时,如果没有定界符,编译器就无法准确判断字符串的结束位置。这时就需要使用定界符来避免这种混淆。

#include <iostream>
#include <string>

int main() {
    // 使用定界符 "abc"
    std::string rawWithDelimiter = R"abc(This is a "raw" string with delimiter (abc).)abc";
    std::cout << "Raw with delimiter: " << rawWithDelimiter << std::endl;

    return 0;
}

当字符串内容中包含 ) 时,可以使用定界符来避免混淆。 

运行结果:

Raw with delimiter: This is a "raw" string with delimiter (abc).

示例 3:多行原始字面量

#include <iostream>
#include <string>

int main() {
    std::string multiLineRaw = R"(
        This is a multi-line
        raw string.
        It can contain "quotes"
        and \ backslashes without escaping.
    )";
    std::cout << "Multi-line raw string:" << std::endl;
    std::cout << multiLineRaw << std::endl;

    return 0;
}

 在这个示例中,原始字面量可以直接包含换行符,无需使用 \n 进行转义。

通过使用原始字面量,可以使包含特殊字符的字符串的书写更加简洁和易读。

运行结果:

Multi-line raw string:

        This is a multi-line
        raw string.
        It can contain "quotes"
        and \ backslashes without escaping.


网站公告

今日签到

点亮在社区的每一天
去签到