C++11新特性(一)——原始字面量

目录

[1. 原始字面量的使用](#1. 原始字面量的使用)

[2. 注意事项](#2. 注意事项)


1. 原始字面量的使用

在C++11 中添加了定义原始字符串的字面量,定义方式为 R "xxx(原始字符串)xxx",其中()两边的字符串可以省略。原始字面量R可以直接表示字符串的实际含义,不需要额外的转义字符进行转义

例如,当我们要打印一个路径时,由于路径字符串中常常包含一些特殊字符,传统方法通常需要使用转义字符 '\' 来处理。但如果使用原始字符串字面量,就可以轻松解决这个问题。

cpp 复制代码
int main(int argc, char const *argv[])
{
    string str = "D:\hello\world\test.text";
    cout << "str: " << str << endl;
    string str1 = "D:\\hello\\world\\test.text";
    cout << "str1: " << str1 << endl;
    string str2 = R"(D:\hello\world\test.text)";
    cout << "str2: " << str2 << endl;
    return 0;
}

输出结果

cpp 复制代码
D:helloworld    est.text
D:\hello\world\test.text
D:\hello\world\test.text
  • 第一条语句中,\h 和 \w 转义失败,对应地字符串会原样输出
  • 第二条语句中,第一个反斜杠是对第二个反斜杠的转义,最终才能得到一个没有特殊含义的普通字符 \
  • 第三条语句中,使用了原始字面量 R() 中的内容来描述路径的原始字符串,因此无需做任何处理

在 C++11 之前如果一个字符串分别写到了不同行里,需要加连接符,这种方式不仅繁琐,还破坏了表达式的原始含义,如果使用原始字面量就变得简单很多,很强直观,可读性强。我们通过一个输出 HTML 标签的例子体会一下原始字面量。

cpp 复制代码
int main(int argc, char const *argv[])
{
    string str = R"(<html>
                    <head>
                        <title>
                            海贼王
                        </title>
                    </head>
                    <body>
                        <p>
                            我是要成为海贼王的男人!!!
                        </p>
                    </body>
                 </html>)";
    cout <<  str << endl;
    return 0;
}

输出结果

cpp 复制代码
str: <html>
        <head>
            <title>
                海贼王
            </title>
        </head>
        <body>
            <p>
                我是要成为海贼王的男人!!!
            </p>
        </body>
    </html>

2. 注意事项

最后强调一个细节:在 R "xxx()xxx" 中,原始字符串必须用括号()括起来,括号的前后可以加其他字符串,所加的字符串会被忽略,并且加的字符串必须在括号两边同时出现(两边出现的字符串长度、顺序都要一模一样)。因此,为了方便,我们在实际使用中通常不会在 () 两侧加字符串。

cpp 复制代码
std::string s4 = R"123(abc\def)123"; // 成功输出 abc\def
std::string s5 = R"123(abc)456";     // 报错,左侧"123"和右侧"456",不匹配
相关推荐
天赐学c语言8 小时前
12.6 - K个一组翻转链表 && C 编译到执行的4个阶段
数据结构·c++·链表·c编译
谷粒.8 小时前
测试数据管理难题的7种破解方案
运维·开发语言·网络·人工智能·python
zzhongcy8 小时前
Java: HashMap 和 ConcurrentHashMap的区别
java·开发语言
梨落秋霜8 小时前
Python入门篇【基础语法】
开发语言·python
爪哇部落算法小助手9 小时前
每日两题day65
数据结构·c++·算法
橘颂TA9 小时前
【剑斩OFFER】算法的暴力美学——颜色分类
数据结构·c++·算法·动态规划
啊森要自信9 小时前
【STM32】USART串口通信
c语言·开发语言·stm32·单片机·嵌入式硬件
小白学大数据9 小时前
Python 多线程爬取社交媒体品牌反馈数据
开发语言·python·媒体
祝余Eleanor9 小时前
Day 31 类的定义和方法
开发语言·人工智能·python·机器学习