Chapter 2:Setting Out to C++
对齐第6版 Chapter 2:解剖 main 函数与 C++ 语句,掌握 cout/cin、变量、表达式和函数初识,并通过逐语句状态追踪验证程序。
学习目标
- 能解释 main 函数、预处理指令、声明、表达式语句、复合语句和 return 在最小程序中的责任
- 能实现 cout 输出与 cin 输入,预测插入/提取方向、字符表示、变量状态和失败后的控制责任
- 能写出函数声明、调用和定义,绘制参数进入、局部执行、返回值离开的最小调用链
为什么“能运行”还不等于读懂程序
最小程序只有几行,但每一行处在不同语法层:#include 是预处理指令,main 定义函数,花括号包围复合语句,声明创建名字与对象,表达式语句执行操作,return 把状态交还运行环境。把所有行统称为“命令”会让错误边界变得模糊。
#include <iostream>
int main() {
int cups{0};
std::cout << "How many cups? ";
std::cin >> cups;
std::cout << "You entered " << cups << '\n';
return 0;
}运行这段程序前,先预测提示文字、等待输入的位置、输入 4 后变量值和最终输出。然后输入 four,观察提取失败后程序仍继续使用什么值,为 Chapter 17 的流状态留下问题。
C++ 语句以状态变化为阅读单位
声明语句 int cups{0}; 创建一个已初始化对象;赋值表达式语句 cups = 4; 修改已有对象;函数调用语句可能通过返回值或副作用改变状态;复合语句 { ... } 把若干语句组成一个作用域和控制单元。
空白通常分隔 token 并服务阅读,但字符串内部空格属于数据。分号结束简单语句,不应放在函数头后面把定义意外变成声明,也不应在 if 条件后无意创建空语句。
cout 把值转换成输出字符
std::cout 是标准输出流对象,<< 是插入运算符。箭头指向流:把右侧值的字符表示插入 cout。链式表达式从左向右处理,所以文字、数字和换行可以依次输出。
int apples{3};
int oranges{4};
std::cout << "total = " << apples + oranges << '\n';'\n' 插入换行字符;std::endl 还会请求刷新缓冲区。普通逐行输出通常用 \n,不要把强制刷新当成固定格式要求。输出看到 7 证明表达式在此输入下得到 7,不证明所有边界都正确。
cin 从输入字符解析目标类型
std::cin 是标准输入流对象,>> 是提取运算符。箭头从流指向变量:读取字符,尝试按变量类型转换并写入。输入不是“直接把键盘按键塞进 int”,中间有缓冲和格式化解析。
double distance{0.0};
std::cout << "distance: ";
if (std::cin >> distance) {
std::cout << "twice = " << distance * 2.0 << '\n';
} else {
std::cerr << "invalid number\n";
}即使本章只初识输入,也应让读取成功成为继续条件。否则输入格式错误后变量保持旧值或流进入失败状态,后续结果看似正常却不再对应新输入。
变量让中间状态可命名
变量是有类型、存储期和值状态的命名对象。声明决定类型和作用域,初始化建立首值,之后赋值修改值。int count; 在某些位置不会自动获得业务上有意义的值;优先在声明处初始化。
变量名应表达量的含义和单位,例如 distanceMeters 比 d 更容易检查。变量与函数共同建立数据流:变量保存每一步状态,函数声明输入、输出和副作用边界。输入、计算和输出之间保留中间变量,可以在调试时观察每一步;当表达式已经简单且命名不能增加含义时,也无需机械拆分。
函数把一项计算形成可调用模块
函数包含声明、调用和定义三种视角。声明让调用点知道名字、参数和返回类型;调用提供实参并转移控制;定义建立形参和局部状态、执行函数体并返回结果。
↡具有名字、参数契约、返回类型和函数体,可由调用表达式重复使用的程序模块。int double_it(int value); // declaration
int main() {
int input{5};
int result{double_it(input)}; // call
std::cout << result << '\n';
}
int double_it(int value) { // definition
return value * 2;
}调用时 input 的值复制给形参 value;函数局部计算后返回新 int,初始化 result。本章只建立调用骨架,数组参数、递归、函数指针、引用和模板分别在 Chapter 7–8 深入。
用逐语句追踪替代目测
为每条关键语句写 before/after:哪些名字存在、值是什么、流处于什么状态、控制接下来去哪。若无法写出 after,就先缩小表达式或增加中间变量,而不是连续运行等待偶然正确。
状态表至少列出语句编号、进入前变量、输入字符、流是否成功、离开后变量和下一条语句。对同一程序分别填合法数字、空输入和文本输入三行,可以直接看到“执行过语句”与“成功产生新值”的差别,也为后续分支测试提供基线。
三步验证一个输入、计算、输出程序
第一步:标注程序骨架
区分预处理指令、main 定义、声明、表达式语句和 return;为每行写出语法责任与预期证据。
小结
- main 函数是程序入口,函数体由声明、表达式、复合语句和 return 等 C++ 语句组成
- cout 使用
<<把值格式化为字符,cin 使用>>从字符解析目标类型,方向不能靠图形相似猜测 - 变量应在声明处建立首值,名字、类型、作用域和单位共同构成状态契约
- 函数声明支持调用检查,定义提供行为,调用建立参数与返回值的数据流
- 逐语句写 before/after 并测试非法输入,比只看一次正常输出更能证明理解
练习
- 问题 1:解剖程序。
#include、main、变量声明、cin 语句和 return 分别属于什么责任?
- 问题 2:判断箭头。 为什么
cout << value和cin >> value的运算符方向不同?
- 问题 3:追踪函数。 调用
double_it(input)时,input、value、返回值和 result 如何变化?
名词解释
名词解释
本章出现的专业名词,用大白话再讲一遍。
- main 函数
- 运行环境调用的托管 C++ 程序入口函数。
- C++ 语句
- 在函数体中完成一个声明、表达式、控制或返回动作的语法单位。
- 标准输出流
- 把值格式化为字符并送往标准输出的 cout 对象。
- 标准输入流
- 从标准输入读取字符并按目标类型转换的 cin 对象。
- 变量
- 具有类型、名字、存储和值状态的对象。
- 函数
- 以参数和返回类型形成调用契约的可复用程序模块。