📄 一句话概括
第二章解决的是同一个问题:数据从哪儿来、装进哪种盒子、怎么算、怎么显示。四块拼图——程序骨架(2.1:预处理、命名空间、main、函数体、返回值、注释)、常量(2.2:五类字面量 + 符号常量)、变量(2.3:标识符、声明与赋值、整型/实型/字符)、类型与输入输出(2.4~2.5:数值/字符/布尔类型、cin/cout 与格式控制)。第一章给你骨架,这一章给骨架装上了"会变的数据"。
一、本章知识地图
| 块 | 小节 | 一句话要点 |
|---|---|---|
| 程序骨架 | 2.1 | 四段料:#include → using namespace std; → int main(){} → 注释 |
| 2.1.1 | #include 是预处理指令:编译前把头文件内容原样贴进来,不带分号 |
|
| 2.1.2 | iostream = i + o + stream;给你 cin cout cerr clog |
|
| 2.1.3 | 命名空间解决名字冲突;std:: 是全名,using 是省事写法 |
|
| 2.1.4 | main 是唯一入口,函数名不能改 |
|
| 2.1.5 | 函数体 = 花括号里的语句,同时是作用域边界 | |
| 2.1.6 | return 0 交给操作系统(0 = 正常),返回值不是屏幕输出 |
|
| 2.1.7 | 注释写"为什么",// 与 /* */(不可嵌套) |
|
| 常量 | 2.2 | 五类:整型 / 实型 / 字符 / 字符串 / 其他 |
| 2.2.1 | 四种进制;010 是八进制,等于 8 |
|
| 2.2.2 | 小数与指数两种写法;默认 double;浮点是近似值 |
|
| 2.2.3 | 'A' 是整数 65;转义字符 '\n' |
|
| 2.2.4 | "A" 占 2 字节(末尾自动加 '\0') |
|
| 2.2.5 | 符号常量:const 优先,#define 只是文本替换 |
|
| 变量 | 2.3 | 三要素:类型 / 名字 / 值 |
| 2.3.1 | 标识符规则;区分大小写、不能数字开头、不能是关键字 | |
| 2.3.2 | 声明 → 赋值 → 初始化;未初始化=垃圾值 | |
| 2.3.3 | 整型家族与范围;溢出会回绕,还不报错 | |
| 2.3.4 | float 7 位 / double 15 位;拿不准就 double |
|
| 2.3.5 | char 装 1 字节;字符能算;大写小写差 32 |
|
| 类型与 I/O | 2.4 | 类型决定:占多大 / 怎么解读 / 能算什么 |
| 2.4.1 | 选型四条;5 / 2 得 2,5.0 / 2 得 2.5 |
|
| 2.4.2 | char 家族的符号性;UTF-8 一个汉字 3 字节 |
|
| 2.4.3 | bool 两个值、1 字节;非 0 即真 |
|
| 2.5 | 流的方向:cin >> 抽进来、cout << 推出去 |
|
| 2.5.1 | 控制台三条通道;输出可重定向到文件 | |
| 2.5.2 | cin 三条规则:跳空白 / 按类型读 / 失败就罢工 |
|
| 2.5.3 | fixed + setprecision(2);setw 只生效一次 |
二、必须记住的六个结论
- 程序骨架固定:
#include→using namespace std;→int main() { 你的代码 return 0; }。后面所有章节,都是往这骨架里"加料" 'A'与"A"是两种东西:'A'是字符(1 字节,值 65);"A"是字符串(2 字节,末尾带'\0')- 变量必须先初始化再用:声明了不等于有值,未初始化的变量里是垃圾值
- 类型决定结果:范围(溢出回绕)、精度(浮点近似)、运算(整数除法丢小数)。想要小数结果,参与运算的至少有一个是浮点
cin会"罢工":输入类型不符后,流进入失败状态,后面所有读取全部失效——输入必须校验- 输出要排版就
fixed + setprecision:setw只对下一个输出有效,setprecision不配fixed时是"有效数字"不是"小数位数"
三、动手 Demo:把第二章"考"自己一遍
第一关(写程序):做一个成绩单程序,要求——
- 提示用户输入三门课的成绩(可以带小数)
- 输出总分与平均分
- 总分与平均分都保留一位小数
- 最后把平均分再用"整数"形式打印一遍(考察整数除法)
参考骨架(自己补完再对照):
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double s1, s2, s3;
cout << "请输入三门课成绩(空格分开):";
cin >> s1 >> s2 >> s3;
double total = s1 + s2 + s3;
double avg = total / 3;
cout << fixed << setprecision(1);
cout << "总分:" << total << endl;
cout << "平均分:" << avg << endl;
cout << "整数形式的平均分:" << (int)avg << endl; // 小数被丢掉
return 0;
}
看到什么算成功:输入 80 90 100,总分 270.0、平均分 90.0、整数形式 90。卡住的地方就是你该回看的小节(输入问题回 2.5.2、小数位回 2.5.3)。
第二关(找错):下面这段代码有几处问题?分别是哪几处?
#include <iostream>
using namespace std
int Main() {
int 2age = 18;
int price
cout << "价格是" << price << endl;
return 0
}
答案(六处):
using namespace std缺分号Main应为小写main(否则找不到入口)int 2age—— 标识符不能数字开头int price缺分号price未初始化就使用(垃圾值,虽然能编过)return 0缺分号
30 秒实验:把 int price 改成 double price = 19.9;,加上缺的分号,改好 main——这一小段就成了一个可以正常运行的程序。
四、常见误区(本章汇总)
- "能跑起来就等于学会了"——能跑只是及格。能说清每一行的类型、范围、结果为什么是这样,才算过关
- "类型是小事,先跑通再说"——本章几乎所有的坑(溢出、精度、整数除法、乱码)根源都是类型。类型想清楚,后面少写一半 debug
- "报错说明写错了,不报错说明写对了"——溢出、浮点误差、未初始化、整数除法都不报错。它们比报错更危险
- "
cin输错了再输一次就好"——流会卡在失败状态,必须显式清除。"输入校验"是这一章埋下的伏笔,第 4 章会用循环实现"输错就重新输"
自测五问(点开对答案)
1. `'A'` 和 `"A"` 分别占几字节?——1 字节和 **2 字节**(后者末尾自动加 `'\0'`)。 2. 为什么 `010` 不等于 10?——**前导 0 表示八进制**,八进制的 10 等于十进制 8。 3. `int a = 7, b = 2; cout << a / b;` 输出什么?想得到 3.5 该怎么改?——输出 **3**(整数除法);改成 `(double)a / b` 或 `a / 2.0`。 4. `setprecision(2)` 和 `fixed << setprecision(2)` 有什么区别?——前者是 **2 位有效数字**(`3.14159` → `3.1`);后者是**2 位小数**(→ `3.14`)。 5. 下一章学什么?——在已有类型的基础上,开始正式学**运算**(把数据算起来),以及用判断和循环控制流程。- ☑ 第三章 运算符与表达式 ✅ → 运算符
相关笔记
- 小结 —— 第一章的知识地图
- 🔷 C++基础 · 索引 —— 全课路线图
- 整型变量 —— 本章最难的一节(溢出)
- C++语言中的流 —— 输入校验的伏笔
- 算术运算符 —— 第三章第一坑:整数除法丢小数,2.4.1 的伏笔在此兑现