Files

143 lines
6.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### **C++ 字符类型 `char` 与转义字符 讲义**
#### **第一部分:字符类型 `char` (存储单个字符的盒子)**
##### **1. 问题引入:除了数字,程序还能处理什么?**
在之前的学习中,我们已经学会了用 `int` 存储整数,用 `double` 存储小数。但我们的世界是由丰富多彩的文字和符号构成的。比如,我们要编写一个程序,实现一个简易计算器,用户会输入 `7 * 2` 这样的算式。
* `7` 和 `2`,我们可以用 `int` 类型的变量来存储。
* 但是中间的那个乘号 `*` 呢?它不是一个数字,我们该用什么类型的“盒子”来装它呢?
这时候,`char` 类型就登场了。
##### **2. 什么是 `char` 类型?**
`char` 是 "character" (翻译:字符) 的缩写。它是一种专门用来存放**单个字符**的数据类型。
你可以把它想象成键盘上的**任意一个按键**,它可以是:
* 一个英文字母 (大写或小写): `'A'`, `'b'`, `'Z'`
* 一个数字字符: `'0'`, `'1'`, `'9'` (注意:这和数字 `0, 1, 9` 是不同的)
* 一个标点或符号: `','`, `'.'`, `'?'`, `'+'`, `'*'`
* 一个空格: `' '`
##### **3. 如何在 C++ 中使用 `char`?**
`char` 的使用方式和 `int` 基本一致,但有一个**极其重要**的区别:
> **在为 `char` 变量赋值或进行比较时,字符值必须被一对单引号 `' '` 包围。**
* **正确的写法**:
```cpp
char c1 = 'A'; // 正确!用单引号包围
char c2 = '*';
char c3 = ' '; // 空格也是一个字符
```
* **错误的写法**:
```cpp
char c4 = A; // 错误!编译器会认为 A 是一个变量名,而不是字符'A'
char c5 = "A"; // 错误!双引号 "" 是用来表示字符串的,不能用于单个字符
```
##### **4. 实战演练:简易计算器**
* **问题**:输入两个整数和一个乘号 `*`,输出这两个整数的乘积。
* *输入样例*: `7 * 2`
* *输出样例*: `14`
* **逻辑分析**:
1. **准备“盒子”**:我们需要两个盒子装整数,一个盒子装中间的 `*` 号。
* `int num1, num2;`
* `char op;` (`op` 是 operator/操作符的英文缩写)
2. **接收“原料”**:C++ 的 `cin` 非常智能,它会根据你变量的顺序和类型,自动读取并分割输入。
* `cin >> num1 >> op >> num2;` 当用户输入 `7 * 2` 时,`cin` 会把 `7` 存入 `num1`,把 `*` 存入 `op`,把 `2` 存入 `num2`。
3. **加工计算**:`int result = num1 * num2;`
4. **交付产品**:`cout << result;`
* **完整代码**:
```cpp
#include <iostream>
using namespace std;
int main() {
int num1, num2;
char op; // 准备一个char类型的盒子来装运算符
cout << "请输入一个乘法表达式 (如 7 * 2): ";
cin >> num1 >> op >> num2;
int result = num1 * num2;
cout << "计算结果是: " << result << endl;
return 0;
}
```
---
#### **第二部分:转义字符**
##### **1. 观察代码**
我们已经知道,放在双引号 `""` 里的内容,通常会被原样输出。但请观察以下代码:
```cpp
cout << "hello\nworld";
```
按照我们的直觉,屏幕上应该会打印出 `hello\nworld`。但实际运行结果却是:
```
hello
world
```
我们发现:
1. 字符 `\` 和 `n` 在屏幕上“神秘地消失”了。
2. `world` 被打印到了新的一行。
**原因解析**:这并不是 Bug,而是因为 `\n` 是 C++ 语法中的一个**转义字符。
##### **2. 转义字符的原理与应用**
* **什么是转义字符?**
转义字符是一种特殊的符号组合,它以反斜杠 `\` 开头,用于在代码中表示一些**无法直接打印的控制功能**(如换行、制表符)或**具有特殊语法含义的字符本身**(如双引号、反斜杠自己)。
你可以把反斜杠 `\` 想象成一个“**魔法棒**”。当它出现在一个字符前面时,它会**改变**后面那个字符的本来面目,赋予它一个特殊的魔法效果。
* **常用转义字符对照表**
| 转义符 | 术语 | 实际作用与说明 |
| -------- | -------------- | ------------------------------------------------------------ |
| **`\n`** | **换行符** | 效果:**换行**。将光标移动到下一行的行首。 |
| **`\t`** | **水平制表符** | 效果:**对齐**。将光标向前跳跃一个制表位的距离(通常相当于几个空格)。 |
| **`\\`** | **反斜杠字符** | 效果:让它变回一个普通的反斜杠字符并打印出来,即输出一个反斜杠本身。 |
| **`\"`** | **双引号字符** | 效果:让它变回一个普通的双引号字符并打印出来,即输出一个双引号本身。 |
| **`\'`** | **单引号字符** | 用于打印单引号本身。 |
##### **3. 综合应用实例**
* **任务目标**:在屏幕上输出下面这句话:
> `小明说:"what is \n"`
* **逻辑推演**:
1. **基础结构**:首先,整句话是一个字符串需要通过 `cout` 输出,那么需要用一对双引号包围。
`cout << "小明说:"what is \n"";` <-- 如果这样直接写,就全部乱套了!
2. **解决内部双引号冲突**:目标文本中的双引号 `"` 会让编译器误以为字符串提前结束了。我们需要用 `\"` 来告诉编译器:这个双引号只是一个普通字符,我想要输出它本身,不是字符串的边界。
3. **解决 `\` 的冲突**:我们想输出 `\` 本身。于是我们需要用 `\\` 来打印出那个反斜杠本身。
`cout << "小明说:\"what is \\n\"";` <-- 解决!
* **C++ 实现代码**:
```cpp
#include <iostream>
using namespace std;
int main() {
cout << "小明说:\"what is \\n\"" << endl;
return 0;
}
```
#### **总结**
* **`char`** 是用来存储**单个**字符的“小盒子”,它的值必须用**单引号`''`**括起来。
* **转义字符**以反斜杠 `\` 开头,它能赋予紧随其后的字符一个**特殊的功能**或让其**变回普通字符**。
* `\n` (换行) 和 `\t` (制表) 是最常用的功能性转义字符。
* 当你需要在字符串中打印 `"` 或 `\` 本身时,必须在它们前面再加上一个 `\`,即使用 `\"` 和 `\\`。