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

第二章解决的是同一个问题:数据从哪儿来、装进哪种盒子、怎么算、怎么显示。四块拼图——程序骨架(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 只生效一次

二、必须记住的六个结论

  1. 程序骨架固定:#include → using namespace std; → int main() { 你的代码 return 0; }。后面所有章节,都是往这骨架里"加料"
  2. 'A' 与 "A" 是两种东西:'A' 是字符(1 字节,值 65);"A" 是字符串(2 字节,末尾带 '\0')
  3. 变量必须先初始化再用:声明了不等于有值,未初始化的变量里是垃圾值
  4. 类型决定结果:范围(溢出回绕)、精度(浮点近似)、运算(整数除法丢小数)。想要小数结果,参与运算的至少有一个是浮点
  5. cin 会"罢工":输入类型不符后,流进入失败状态,后面所有读取全部失效——输入必须校验
  6. 输出要排版就 fixed + setprecision:setw 只对下一个输出有效,setprecision 不配 fixed 时是"有效数字"不是"小数位数"

三、动手 Demo:把第二章"考"自己一遍

第一关(写程序):做一个成绩单程序,要求——

  1. 提示用户输入三门课的成绩(可以带小数)
  2. 输出总分与平均分
  3. 总分与平均分都保留一位小数
  4. 最后把平均分再用"整数"形式打印一遍(考察整数除法)

参考骨架(自己补完再对照):

#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
}

答案(六处):

  1. using namespace std 缺分号
  2. Main 应为小写 main(否则找不到入口)
  3. int 2age —— 标识符不能数字开头
  4. int price 缺分号
  5. price 未初始化就使用(垃圾值,虽然能编过)
  6. return 0 缺分号

30 秒实验:把 int price 改成 double price = 19.9;,加上缺的分号,改好 main——这一小段就成了一个可以正常运行的程序。

四、常见误区(本章汇总)

  1. "能跑起来就等于学会了"——能跑只是及格。能说清每一行的类型、范围、结果为什么是这样,才算过关
  2. "类型是小事,先跑通再说"——本章几乎所有的坑(溢出、精度、整数除法、乱码)根源都是类型。类型想清楚,后面少写一半 debug
  3. "报错说明写错了,不报错说明写对了"——溢出、浮点误差、未初始化、整数除法都不报错。它们比报错更危险
  4. "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. 下一章学什么?——在已有类型的基础上,开始正式学**运算**(把数据算起来),以及用判断和循环控制流程。

相关笔记