Initial commit: C++ courseware

This commit is contained in:
xiaolinquan committed 2026-11-05 22:51:02 +08:00
commit 4a4ee7c287
1789 files changed
+373489

No files matched your search

@@ -0,0 +1,143 @@
### **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` (制表) 是最常用的功能性转义字符。
* 当你需要在字符串中打印 `"` 或 `\` 本身时,必须在它们前面再加上一个 `\`,即使用 `\"` 和 `\\`。