在 C++ 中,普通的文字直接写进双引号或单引号里就能正常表示。但如果我们想在文本中表示换行、制表间隔,或者直接输出英文引号与反斜杠本身,按普通字符写进去往往会遇到语法冲突,甚至引发编译报错。
为了解决这个问题,C++ 提供了转义字符(Escape Character)。转义字符由一个反斜杠(\)和紧跟在后面的字符共同组成,用来转变原本字符的含义。
为什么要使用转义字符?
假设我们使用 std::cout 输出一句话,希望屏幕上的文字带有英文双引号:欢迎来到"绿叶网"。不少初学者首先想到的,就是在 “绿叶网” 两边直接加上英文双引号。但只要把代码写成下面这样,编译器就会直接报错:
std::cout << "欢迎来到"绿叶网""; // 双引号配对冲突为什么这行代码会报错呢?因为在 C++ 中,英文双引号是标记字符串开始和结束的语法符号,而且总是成对出现的。当编译器读到 "欢迎来到" 后面第二个双引号时,就会认为整个字符串已经结束了,紧接着看到后面的 绿叶网"" 无法识别,所以直接就报错了。
想要把内部的英文双引号当成普通文字输出,我们就需要在它前面加上一个反斜杠,写成 \":
std::cout << "欢迎来到\"绿叶网\"";这里的 \" 就是转义字符。反斜杠(\)的作用,说白了就是告诉编译器:紧跟在后面的这个字符不要按常规语法符号处理,请按特殊规则来解析。C++ 中最常用的转义字符如下表所示,初学阶段重点掌握这 5 个就够用了。
| 转义字符 | 说明 | 常见用途 |
|---|---|---|
| \n | 换行符 | 将光标移到下一行开头继续输出 |
| \t | 水平制表符 | 跳到下一个制表位,常用于拉开多列文字的间距 |
| \" | 英文双引号 | 在双引号字符串内部表示一个普通的双引号字符 |
| \' | 英文单引号 | 在单引号字符内部表示一个普通的单引号字符 |
| \\ | 反斜杠 | 在字符或字符串内部表示一个普通的反斜杠字符 |
在使用转义字符时,小伙伴们需要注意以下 2 点:
- 转义字符要严格区分大小写,比如
\n表示换行符,但如果写成大写的\N就会导致编译报错。 - 转义字符虽然表面上写了 2 个符号,但在内存中整体只算 1 个字符,因此也能用单引号括起来赋给
char变量,比如写成char ch = '\n';。
C++ 转义字符的使用
在日常开发中,使用转义字符主要有两个目的:一是表示肉眼 “看不见” 的格式控制字符,比如 \n 和 \t。二是表示与 C++ 语法冲突的字符,比如 \"、\' 和 \\。下面我们结合具体示例来看看它们的用法。
1. 换行符(\n)与制表符(\t)
\n 表示换行,也就是让后面的内容换到下一行开头显示。\t 表示水平制表符,作用相当于按下键盘上的 Tab 键,让光标跳到下一个制表位置。在打印多行多列数据时,我们经常把这两个转义字符配合起来使用。
示例 1:使用 \n 和 \t 排版
#include <iostream>
int main() {
std::cout << "Name\tScore\n";
std::cout << "Jack\t95\n";
std::cout << "Lucy\t88\n";
return 0;
}运行结果如下。
Name Score
Jack 95
Lucy 88分析:
在这个例子中,"Name\tScore\n" 里的 \t 会在 Name 和 Score 之间拉开一段空白间隔,而末尾的 \n 则负责在输出完 Score 之后换到下一行,让三行数据能够上下对应显示。
需要注意的是,制表符 \t 的宽度并不是固定的,它只是跳到下一个制表位(常见为 4 个或 8 个空格宽),具体表现还会受终端环境影响。如果某一项文字特别长,单纯使用 \t 可能还是对不齐,此时可以配合输出格式化工具来固定列宽。
2. 双引号(\")与单引号(\')
在 C++ 中,双引号用来包裹字符串,单引号用来包裹单个字符。当我们需要把引号本身作为普通字符写进同一种引号内部时,就必须使用 \" 或 \'。
示例 2:输出双引号与单引号
#include <iostream>
int main() {
char quote = '\'';
std::cout << "欢迎来到\"绿叶网\"\n";
std::cout << quote;
return 0;
}运行结果如下。
欢迎来到"绿叶网"
'分析:
char quote = '\''; 表示使用 \' 将一个单引号字符保存在 char 变量中。如果直接写成 ''',这里一共出现了 3 个单引号,编译器无法判断哪两个单引号是一对,就会直接报错。
同理,在 "欢迎来到\"绿叶网\"\n" 中,最外层的两个双引号负责标记字符串的开始与结束,里面的 \" 则表示输出普通的双引号字符。
不过小伙伴们不要误解了,并不是只要看到引号就必须加反斜杠。如果是在双引号字符串里面写单引号,或者在单引号字符里面写双引号,因为内外引号种类不同、不会发生配对冲突,直接写出来就可以了:
std::cout << "Let's go!"; // 双引号内可直接写单引号
char ch = '"'; // 单引号内可直接写双引号3. 反斜杠(\\)
既然反斜杠(\)本身已经被 C++ 用来充当转义字符的开头了,那么如果我们真的想输出一个普通的反斜杠,此时应该怎么写呢?答案就是连续写两个反斜杠 \\。这种情况在书写 Windows 文件路径时非常常见。
示例 3:输出 Windows 文件路径
#include <iostream>
int main() {
std::cout << "C:\\new\\test.txt";
return 0;
}运行结果如下。
C:\new\test.txt分析:
"C:\\new\\test.txt" 里的每一对 \\ 都代表一个普通的反斜杠字符,因此最终在屏幕上准确输出为 C:\new\test.txt。
很多初学者在写文件路径时,最容易踩的坑就是只写单个反斜杠:
// 正确方式
std::cout << "C:\\new\\test.txt";
// 错误方式
std::cout << "C:\new\test.txt";上面错误方式中的 "C:\new\test.txt" 表面看起来像一个正常路径,但编译器会把里面的 \n 当成换行符,把 \t 当成制表符,导致打印出来的结果断成两行且出现大片空白。同理,如果想在屏幕上原样显示出 \n 这两个字符而不是换行,写成 std::cout << "\\n"; 就可以了。
提示 如果文件路径很长,连续写双反斜杠 \\ 比较繁琐。C++11 起支持 R"(...)" 原始字符串写法,比如写成 R"(C:\new\test.txt)" 时里面的反斜杠会全部原样输出,在后面学习 std::string 时还会遇到。
