字符变量用 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 打印中文会出怪字符/负数"的根源。所以:
- 单个 ASCII 字符 →
char(够用) - 一串文字(尤其含中文) → 用
string或字符数组(第 6 章之后) - 真的需要 0~255 的字节值 →
unsigned 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' 之后会走到 [ 等非字母字符——因为自增不管"是不是字母")。
六、常见误区
- "
'A'就是字母 A"——内存里是 65。理解这点,'A' + 1的结果就不再意外 - "
char c = "A";应该也行"——不行。双引号是字符串,char装不下(编译报错)。字符一律用单引号 - "
'7'和7是一回事"——不是。'7'是字符(值 55),7是整数。要参与算术得先- '0' - "
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)。- ☑ 数据类型