🔷 第二章 C++语言基础
📄 一句话概括

字符变量用 char 声明,占 1 字节,里面装的其实是一个整数(ASCII 码)——所以它既能当字符用,也能当数字算。char c = 'A'; 存的就是 65:cout << c 显示 A,cout << (int)c 显示 65。本篇把教材的实例 01、02 一并收进来:'A' + 1 得 66、(char)('A' + 1) 得 'B'、'a' - 32 得 'A'(大小写互转)、'7' - '0' 得 7(字符数字转数值)。

一、字符变量的声明与存值

char c1 = 'A';       // 存进去的是 65
char c2 = '7';       // 注意:这是【字符】7,值是 55,不是数字 7
char c3 = ' ';       // 空格也算一个字符
char c4 = '\n';      // 转义字符也是字符

一句话理解:char 是"只能装 1 个字符"的小盒子;盒子里的东西是编码(数字),不是"图形"。

你写 内存里 打印出来
cout << 'A'; 65 A
cout << (int)'A'; 65 65
cout << 'A' + 0; 65 + 0 = 65 65(一旦参与运算就变数字)

关键规律:cout 通过"你给它的东西是什么类型"来决定怎么显示。是 char 就显示文字,是 int 就显示数字。

二、实例 01:字符数据与整型数据之间的运算

char 本质是整数,所以字符可以参与所有算术运算:

char a = 'A';
char b = a + 1;            // 右边是 66,赋给 char 又变成字符 'B'
cout << a << " → " << b << endl;      // 输出 A → B

cout << 'A' + 1 << endl;              // 输出 66(整数)
cout << (char)('A' + 1) << endl;      // 输出 B(强制转成字符)

同一个表达式,两种结果,取决于你怎么接:

写法 结果 原因
char b = 'A' + 1; 'B' 赋给 char 变量 → 按字符理解
cout << 'A' + 1; 66 直接输出 → 按整数理解
cout << (char)('A' + 1); B 用 (char) 强制转回字符

(char) 叫强制类型转换(第 3 章细讲)——意思是"把这个值当作字符来看"。

三、实例 02:对字符数据进行算术运算

最常用的两类场景:

① 大小写互转(差 32)

char lower = 'a';
char upper = lower - 32;        // 'a'(97) - 32 = 65 = 'A'
cout << lower << " → " << upper << endl;      // a → A

char back = upper + 32;         // 'A'(65) + 32 = 97 = 'a'
cout << back << endl;                         // a

② 字符数字转成真正的数值

char ch = '7';
int n = ch - '0';               // 55 - 48 = 7  ← 得到真正的数字 7
cout << n + 3 << endl;          // 10(能参与计算了)

为什么减 '0':因为 '0' 的 ASCII 是 48,字符数字是连续排列的('0'=48、'1'=49…'9'=57),所以 ch - '0' 正好得到它代表的那个数字。这个技巧在处理用户输入时天天用(比如 cin >> ch 读进来的是字符 '7',要算数就得先减 '0')。

③ 字符自增

char c = 'A';
c++;                    // 相当于 c = c + 1
cout << c << endl;      // B

四、一个容易踩的坑:char 装得下中文吗

装不下。char 只有 1 字节(0~255)。UTF-8 下一个汉字要 3 个字节,所以:

char c = '中';          // ⚠ 报错或警告:字符常量太长

另一个相关现象:char 在多数编译器里是有符号的(范围 −128~127)。ASCII 字符(0~127)没问题,但超过 127 的字节会被当成负数——这就是"用 char 打印中文会出怪字符/负数"的根源。所以:

五、动手 Demo:把两个实例跑一遍

新建 charvar.cpp:

#include <iostream>
using namespace std;

int main() {
    char a = 'A';
    cout << "a = " << a << ",ASCII 码 = " << (int)a << endl;

    // 实例 01:字符与整型互算
    cout << "'A' + 1 输出为整数:" << 'A' + 1 << endl;
    cout << "'A' + 1 输出为字符:" << (char)('A' + 1) << endl;

    // 实例 02:大小写转换
    char lower = 'd';
    cout << lower << " 转大写 = " << (char)(lower - 32) << endl;

    // 字符数字转数值
    char digit = '7';
    cout << "字符 " << digit << " 变成数值后乘 2 = " << (digit - '0') * 2 << endl;

    // 自增
    char c = 'X';
    c++;
    cout << "X 自增后 = " << c << endl;
    return 0;
}

看到什么算成功:

a = A,ASCII 码 = 65
'A' + 1 输出为整数:66
'A' + 1 输出为字符:B
d 转大写 = D
字符 7 变成数值后乘 2 = 14
X 自增后 = Y

30 秒实验:把 char lower = 'd'; 换成大写字母,用 +32 转小写;再试试连续自增 26 次,看它是否走完整个字母表('Z' 之后会走到 [ 等非字母字符——因为自增不管"是不是字母")。

六、常见误区

  1. "'A' 就是字母 A"——内存里是 65。理解这点,'A' + 1 的结果就不再意外
  2. "char c = "A"; 应该也行"——不行。双引号是字符串,char 装不下(编译报错)。字符一律用单引号
  3. "'7' 和 7 是一回事"——不是。'7' 是字符(值 55),7 是整数。要参与算术得先 - '0'
  4. "char 也能存中文"——一个汉字在 UTF-8 下占 3 字节,char 只有 1 字节,装不下。中文一律用字符串
自测四问(点开对答案) 1. `char c = 'A';` 里 c 存的是什么?占几字节?——整数 **65**(ASCII 码),占 **1 字节**。 2. `'A' + 1` 和 `(char)('A' + 1)` 有什么区别?——前者是**整数 66**;后者强制按字符解释,结果是 **`'B'`**。 3. 小写转大写怎么写?为什么是 32?——`(char)(c - 32)`;因为 `'a'`(97) 与 `'A'`(65) 相差 **32**。 4. 怎么把字符 `'7'` 变成真正的数字 7?——`'7' - '0'`(55 − 48 = 7)。

相关笔记