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

数据类型决定三件事:这块内存占多大、里面的 0 和 1 怎么解释、能参与什么运算。C++ 的类型分两大类:基本类型(整型、浮点、字符、布尔——本章重点)和构造/复合类型(数组、结构体、指针、类……后面章节再讲)。写代码时选类型,本质上是在替编译器决定"用哪种算盘"——算盘选错,结果就错(5 / 2 得 2,5.0 / 2 得 2.5)。

一、类型到底决定了什么

同样 4 个字节的 0 和 1,按不同类型解释,结果天差地别:

同样的二进制 按 int 解释 按 float 解释
一个 4 字节的位模式 可能是 1084227584 可能是 5.0

所以类型不是"标签",是"解读方式"。它决定:

  1. 占多少内存:char 1 字节、int 4 字节、double 8 字节
  2. 值的范围:short 到 3 万,long long 到 922 京
  3. 能做什么运算:整数能取余(%),浮点不能;字符能按 ASCII 加减
  4. 运算结果是什么:5 / 2 是整数除法得 2;5.0 / 2 得 2.5

二、两大类类型

① 基本类型(本章学这四种)

类别 类型 小节
整型 short int long long long(各有 unsigned 版) 2.3.3、2.4.1
浮点 float double long double 2.3.4、2.4.1
字符 char(以及 signed char/unsigned char) 2.3.5、2.4.2
布尔 bool(true / false) 2.4.3
空 void(表示"没有类型/没有返回值") 第 5 章

② 构造与复合类型(后面章节)

数组、字符串、结构体、联合、枚举、指针、引用、类。它们的共同点是:由基本类型"搭"出来的——比如一个 int 数组,就是"一排 int 小盒子连在一起"。

📝 学习的顺序为什么是这样

先用 int、double、char、bool 这四把"基本工具"把逻辑写顺(第 3~4 章的运算与判断),再去处理"一堆数据"(数组、字符串)、"一个复杂对象"(结构体、类)。基本类型不牢,后面全是空中楼阁。

三、类型修饰符

基本类型还能加"形容词"来微调:

修饰符 作用 例子
unsigned 去掉负数,正数范围翻倍 unsigned int
signed 明确"要有负数"(默认行为) signed int
short / long 调宽窄 short int、long long int
const 值不可改(2.2.5) const int MAX = 100;

省写规则:short int 可以写成 short,long long int 写成 long long,unsigned int 写成 unsigned——都是合法的。

四、C++ 是"静态强类型"语言

两个关键词,各有用处:

和 Python 的对比(如果你以后会接触):

C++ Python
类型什么时候定 写代码时(编译期) 运行时
变量要不要声明类型 要 不用(a = 1 就行)
好处 快、错得早 写得省事
代价 写得啰嗦 错得晚(跑到那行才发现)

结论:C++ 的"啰嗦"换来的是编译期就把错误拦下来——这是它快且稳的根源。

五、动手 Demo:一张 sizeof 体检表

新建 types.cpp:

#include <iostream>
using namespace std;

int main() {
    cout << "char        : " << sizeof(char)        << " 字节" << endl;
    cout << "bool        : " << sizeof(bool)        << " 字节" << endl;
    cout << "short       : " << sizeof(short)       << " 字节" << endl;
    cout << "int         : " << sizeof(int)         << " 字节" << endl;
    cout << "long        : " << sizeof(long)        << " 字节" << endl;
    cout << "long long   : " << sizeof(long long)   << " 字节" << endl;
    cout << "float       : " << sizeof(float)       << " 字节" << endl;
    cout << "double      : " << sizeof(double)      << " 字节" << endl;
    return 0;
}

看到什么算成功:跑出一张表,大致是 1 1 2 4 4 8 4 8(long 在 Windows 上是 4)。

顺手看一个"类型决定结果"的铁证:

cout << 5 / 2 << endl;        // 2   ← 两个整数,做整数除法
cout << 5.0 / 2 << endl;      // 2.5 ← 有一个是小数,做浮点除法

30 秒实验:把 5 / 2 改成 5 % 2(取余),输出 1;再试试 5.0 % 2——编译报错:% 只能用于整数。这就是"类型决定能做什么运算"的直接体现。

六、常见误区

  1. "类型只是个名字,值才是重要的"——类型决定怎么解读这块内存。同一串字节,按 int 和按 float 读出来完全不同
  2. "变量能装任何数,类型无所谓"——每种类型都有范围:short 装不下 10 万,int 装不下手机号(2.3.3 的溢出)
  3. "类型错了编译器会兜着"——有时会(隐式转换),但转换过程可能丢精度(double 转 int 小数被切掉)。编译器不报错 ≠ 结果正确
  4. "void 也是一种数据"——void 表示"没有":没有返回值、没有参数、没有具体类型。它是"空",不是"一种东西"
自测四问(点开对答案) 1. 数据类型决定了哪三件事?——**占多少内存**、**二进制怎么解释**、**能参与什么运算**(以及结果类型)。 2. C++ 的类型分哪两大类?——**基本类型**(整型/浮点/字符/布尔/空)与**构造复合类型**(数组/结构体/指针/类等)。 3. `5 / 2` 和 `5.0 / 2` 分别得多少?为什么?——`2` 和 `2.5`;前者是**整数除法**(小数被丢掉),后者含浮点数,做浮点除法。 4. "静态强类型"是什么意思?——类型在**编译期**确定(静态),不同类型间**不自动混淆**、需要显式转换(强)。

相关笔记