---
slug: char-bool
lesson: 10
chapter: 2
chapterTitle: 变量
title: char 为什么是数字？字符与布尔值讲清楚
description: char 存的是字符的编号（ASCII），'A' 就是 65，所以 char + 1 得到下一个字符。bool 只有真假两个值，输出时显示 1 和 0。本课用可在线运行的示例验证字符的数字本质。
code: |
  #include <iostream>
  using namespace std;

  int main() {
      char c = 'A';
      cout << c << endl;
      cout << (int)c << endl;
      char d = c + 1;
      cout << d << endl;
      bool ok = true;
      cout << ok << endl;
      return 0;
  }
faq:
  - q: char 是什么类型？
    a: 字符类型，存一个字符。本质上存的是字符的编号：'A' 存的是 65，'a' 是 97。这套编号规则叫 ASCII，所以 char 可以参与加减运算。
  - q: "'A' 和 \"A\" 一样吗？"
    a: 不一样。'A' 是 char，本质是数字 65；"A" 是字符串，是文本类型。单引号与双引号不能混用（回顾第 6 课字面量）。
  - q: bool 输出的为什么是 1 和 0？
    a: bool 存 true 和 false，输出时 true 显示为 1，false 显示为 0。条件判断、循环控制都依赖 bool，后续章节会大量使用。
  - q: ASCII 表需要背吗？
    a: 不需要。记住三个锚点就够用：'0' 是 48，'A' 是 65，'a' 是 97，其余字符的编号可以由此推算。
---

<div class="answer">
char 表面存字符，实际存的是字符的编号：'A' 就是 65。所以 char 能做算术，
'A' + 1 得到 'B'。bool 只有 true 和 false 两个值，输出时显示为 1 和 0。
</div>

## char：一个字符，一个数字

`char` 类型存单个字符。计算机不直接认识字母，存下的是字符的**编号**——这套编号叫 ASCII：

- `'A'` 是 65，`'B'` 是 66，依此类推
- `'a'` 是 97，`'0'` 是 48（字符 0，不是数字 0）

```cpp
char c = 'A';
cout << c << endl;        // A（按字符显示）
cout << (int)c << endl;   // 65（按编号显示）
char d = c + 1;           // 66，即 'B'
cout << d << endl;        // B
```

`(int)c` 是把 char 临时转成 int 来看它的编号。既然 char 本质是数字，`c + 1` 就是下一个编号、下一个字符。判断大写转小写（`c + 32`）、数字字符转数字（`c - '0'`）都建立在这个事实上。

## bool：只有真与假

`bool` 类型只有两个值：`true`（真）和 `false`（假）：

```cpp
bool ok = true;
cout << ok << endl;   // 输出 1
```

输出时 true 显示为 1，false 显示为 0。bool 是程序的"判断结果载体"——上一课的 `c == 0.3` 算出来的就是一个 bool。之后的条件、循环全靠它驱动。

## 可视化观察

在 CppStudio 中打开本课示例，点击播放：

1. 执行 `char c = 'A';` 后，监视区出现 c——对照接下来的输出理解"存的是编号"；
2. 两条 cout 先后输出 `A` 和 `65`，同一个变量的两种面貌；
3. 执行 `c + 1` 得到 d，输出 `B`——字符算术的完整证据链；
4. bool 变量 ok 输出 `1`，记住这个显示规则，后面判断题都会遇到。

## 常见错误

- **单双引号混用**：`char c = "A";` 编译报错，char 必须用单引号；
- **把字符 '0' 当数字 0**：`'0' - '0'` 得 0，`'1' - '0'` 得 1——字符数字转数值要减 `'0'`；
- **以为 bool 能装"第三种值"**：给 bool 赋任何非零值都会变成 true，不存在 2。

下一课：一次定义多个变量——连续定义的写法与初始化细节。
