Files

143 lines
6.5 KiB
Markdown
Raw 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++字符与 ASCII 码 讲义
## 1. 概念
在计算机的世界里,一切皆是 0 和 1(二进制)。计算机天生只认识数字,不认识字母、标点符号。
为了让计算机能显示和处理文字,人类制定了一套规则:**给每一个字符指定一个唯一的数字编号**。
* **字符 (Character)**:我们在屏幕上看到的符号(如 `'A'`, `'@'`, `'1'`)。
* **ASCII 码**:一种最基础的编码标准,规定了字符和数字之间的对应关系。
---
## 2. C++ 中的字符类型 (`char`)
在 C++ 中,我们学习了如何储存一个整数或者小数,但是字符是使用 `char` 关键字来定义并储存字符变量的。
### 2.1 基本语法
* **书写方式**:必须使用**单引号** `' '` 括起来。
* **本质**:`char` 类型在内存中实际上存储的是一个**整数**(即该字符对应的 ASCII 码值)。
```cpp
char letter = 'A'; // 正确
char numChar = '5'; // 正确,这是字符5,不是数字5
// char error = "A"; // 错误!双引号代表字符串
```
### 2.2 使用 `char`
**题目描述:请你实现普通计算器的功能,输入两个整数和一个*,输出这两个整数的乘积。**
**样例输入: 7 * 2**
**样例输出: 14**
---
**逻辑解析:**
- **定义容器**:我们需要两个 `int` 类型的变量来存放参与运算的数字,**以及一个 `char` 类型的变量来存放中间的运算符 `*`**,我们就可以定义:`int num1, num2; char ch; `
- **获取数据**:接受用户输入,将三个值分别放入三个变量中,并且按照顺序读取 `cin >> num1 >> ch >> num2;`
- **读取 `num1`**:读取的第一个是整数变量,于是`cin` 接着期待一个整数,例如它读取了 `7`,接着遇到了空格。所以它会**自动结束读取**,将 `7` 存入 `num1` 中。
- **读取 `op`**:接着是一个字符类型变量,于是`cin` 接着期待一个字符。拿到了字符 `*`,并存入字符变量 `op` 中。
- **读取 `num2`**:最后,`cin` 再次期待一个整数。它跳过空格,读取到数字 `2`,存入 `num2`。
- **计算结果:**`num1` 与 `num2` 已经存入了输入的两个整数,最后仅需按照题目要求输出这两个整数的乘积即可:`cout << num1 * num2;`
## 3. 什么是 ASCII 码?
**全称**:American Standard Code for Information Interchange(美国信息交换标准代码)。
因为计算机却只认识数字,不认识字符,那计算机怎么存储“Hello”这个单词呢?
为了解决这个问题,人类制定了一张**强制转换表**,这就是 **ASCII** **码表**。 它规定了每一个符号对应一个特定的整数。字符在计算机内部,本质上就是一个整数。
它是一张“对照表”,规定了 128 个字符对应的数字。
- 当你按下键盘上的 `A`。
- 计算机查表:哦,`A` 对应的是 `65`。
- 计算机存储:在内存里存下 `65` 。
- 当你 `cout` 时:计算机读取 `65`,查表发现是 `A`,然后就输出一个 `A` 在屏幕上
### 3.1 ASCII 码表的构成
1. **0 - 31 (控制字符)**:不可打印,用于控制外围设备,这部分**了解**即可,一般不会用到。
* 例如在我们键盘上的:换行、回车、响铃、退格。
2. **32 - 126 (可打印字符)**:键盘上能打出来的符号。
* 包括:空格、标点、数字、大写字母、小写字母。**这部分需要知道掌握**。
3. **127 (Delete)**:删除控制符,**了解**即可。
---
## 4. 必须记住的关键 ASCII 值
你不需要背诵整个表,但以下几个数值应当记住,因为它们常用于编程逻辑中。
| 字符类别 | 起始字符 | ASCII 值 | 结束字符 | ASCII 值 | 备注 |
| :----------- | :------: | :------: | :------: | :------: | :-------------------------------- |
| **数字** | `'0'` | **48** | `'9'` | **57** | 注意:`'0'` 和 `0` 不是同一个东西 |
| **大写字母** | `'A'` | **65** | `'Z'` | **90** | |
| **小写字母** | `'a'` | **97** | `'z'` | **122** | |
### 规律总结:
1. 数字、大写字母、小写字母都是**连续**排列的。
2. **大小写转换规律**:小写字母的 ASCII 值比对应的大写字母大 **32**。
* `'a' - 'A' = 32`
* `'A' + 32 = 'a'`
---
## 5. 字符与整数的互换 (C++ 的自动类型转换特性)
在 C++ 中,其实`char` 和 `int` 可以自由转换和运算。
1. 源类型向目标类型转换时。如果目标类型能够容纳源类型的值,且转换是安全的,编译器就会自动完成。
- **例如**:`int` 赋给 `double` 是安全的(`int` 转换为 `double`)。
- **但请注意:** `double` 赋给 `int` 时,虽然编译器会尝试转换(截断小数部分),但这通常被认为是**不安全的**,因为它会丢失精度。在严格的编译环境下可能会有警告,甚至在某些情况下需要显式转换(后续会讲解强制类型转化)。
- **整型和浮点型混合运算时,整型会向浮点型转换以避免数据丢失**。**核心原则是** “向高精度、大范围类型转换”,以避免数据丢失。例如,`int` 和 `double` 相加时,`int` 会被转换为 `double`。
简单来说,C++的自动类型转换是尽力让你在不同类型之间进行操作时,得到一个合理的结果,并且尽量不丢失数据。
### 5.1 查看字符的 ASCII 码
**使用 `int` 类型的变量来接住 `char` 类型的值。**
```cpp
#include <iostream>
using namespace std;
int main() {
char c = 'A';
cout << "字符: " << c << endl; // 输出 A
int num = c;
cout << "ASCII值: " << num << endl; // 输出 65
return 0;
}
```
### 5.2 字符运算 (算术操作)
**因为字符本质是整数(通过ASCII码来进行对照),所以可以进行加减乘除。**
==**案例 1:大小写转换(重要,必须掌握)**==
利用小写与小写字符中的差值为 32 进行转化。
```cpp
char upper = 'B';
char lower = upper + 32; // 66 + 32 = 98 ('b')
cout << lower << endl; // 输出 b
```
==**案例 2:数字字符 转 整数数字**==
这是算法题中非常常见的操作。因为数字字符在ASCII码里是连续的,所以任意一个 字符数字 和 字符0 之间的差值就是字符数字对应的整数数字。
例如`'7' - '0' = 7, '4' - '0' = 4, '0' - '0' = 0`。
```cpp
char c_num = '8';
int i_num = c_num - '0'; // '8'(56) - '0'(48) = 8
cout << i_num << endl; // 输出数字 8
```