C++ 数据类型:int、double、char、bool
一句话:类型告诉编译器一个值占几个字节、这些字节怎么解释。初学者天天打交道的四个:int(整数)、double(小数)、char(一个字符 — 其实是个小整数)、bool(真/假,打印成 1/0)。
四种类型同台
#include <iostream>
using namespace std;
int main() {
int age = 25; // 整数
double price = 9.99; // 小数
char grade = 'A'; // 一个字符,单引号
bool ok = true; // 真或假
cout << age << " " << price << " " << grade << " " << ok << endl;
return 0;
}
两处要看:grade 用单引号('A',不是 "A" — 那是字符串,混用是经典编译错误);ok 打出来是 1 不是 true — cout 默认把 bool 显示为数字,想要 true/false 得写 boolalpha。
四段速览
| 类型 | 存什么 | 典型大小 | 要小心 |
|---|---|---|---|
int | 整数 | 4 字节 | 超 ±21 亿溢出;7/2 等于 3 |
double | 小数 | 8 字节 | 0.1 + 0.2 不严格等于 0.3(浮点误差) |
char | 一个字符 | 1 字节 | 'a' vs "a";它暗地里是数字 |
bool | 真 / 假 | 1 字节 | 打印成 1/0;任何非零数转 bool 都是真 |
大小写的是"典型值":C++ 标准只定下限不定精确值 — 桌面编译器上 sizeof(int) 会告诉你你这台机器的真实答案。
char 是穿了戏服的数字
每个字符都以整数编码(ASCII)存储:'A' 是 65,'a' 是 97,'0' 是 48。所以字符能做算术:
#include <iostream>
using namespace std;
int main() {
char c = 'A';
cout << c << " is code " << (int)c << endl;
cout << "next letter: " << (char)(c + 1) << endl;
cout << "digit '7' as number: " << '7' - '0' << endl;
return 0;
}
最后一行 — '7' - '0' — 是货真价实的面试级惯用法:把数字字符转成数值。'7' 的编码是 55,'0' 是 48,一减恰好剩 7 — 对每个数字字符都成立,不需要查表。
各自怎么翻车
- int 靠回绕翻车。2,147,483,647 + 1 不报错 — 静悄悄变成垃圾值(有符号溢出是未定义行为)。阶乘一题把 N 上限设在 12,正是因为 13! 溢出。
- double 靠误差翻车。
0.1 + 0.2打出来像0.3,但用==比却不相等。永远别用==比 double;要用容差。也别用 double 存钱 — 用整数存分。 - char 靠引号翻车。
char c = "A";编译不过 —"A"是字符串。一个字符永远单引号。 - bool 靠隐式转换翻车。
bool b = 5;编译通过且为true— 任何非零值都转真。while (cin >> x)这类循环靠这个吃饭,别处则是暗雷。
int 还是 double — 新手的决策树
- 值可能带小数吗?(平均、价格、百分比)→
double。 - 是计数、下标、年份、分数?→
int。 - 要超过 ±21 亿?→ 桌面编译器上用
long long(练习场覆盖教学核心,见编译器安装指南)。 - 钱?→ 整数存分。认真的。
类型相关面试题
- "cout 打印 bool 输出什么?" — 1 或 0;
cout << boolalpha切换成 true/false。 - "为什么 7 / 2 等于 3?" — 两边是 int,做的是整数除法(完整指南在这)。
- "'A' 和 "A" 差在哪?" — 一个 char(一字节,编码 65)vs 一个字符串(以
'\0'结尾的数组)。 - "int 溢出会怎样?" — 有符号溢出是未定义行为:没有异常,没有可靠的回绕;编译器可以假设它从不发生。
- "字符算术有什么用?" — 数字转换(
'7' - '0')、大小写转换(c - 'a' + 'A'),一切文本处理的底层原理。
练习
相关:整数除法、传值、指针与引用、15 道初学者面试题。