语言地基
从输入输出、类型、表达式到函数,把“能编译”变成能解释。
把源文件想成一份菜谱:预处理器展开头文件,编译器把 C++ 翻译成目标文件,链接器把库函数接进来,最后操作系统才启动可执行文件。遇到错误时先判断它属于哪一阶段。
#include <iostream>
int main() {
std::cout << "Hello, C++\n";
}std::cout 是输出流,std::cin 是输入流。<< 把数据送进输出流,>> 从输入流取出数据。一次读取失败后,流会记住失败状态,后面的读取也会停止,直到清除状态。
int age{};
std::cout << "Age: ";
if (std::cin >> age) std::cout << age + 1;
else std::cerr << "请输入整数";if 适合二选一,switch 适合一个值对应多个固定分支,while 适合“只要条件成立就继续”,for 适合有明确计数或遍历范围的任务。每个大括号都可以建立自己的作用域。
for (int i = 1; i <= 3; ++i) {
if (i == 2) continue;
std::cout << i << "\n";
}把重复的计算提炼成函数,调用者只需要知道参数和返回值。书中的 Sales_item 例子还展示了如何把一个销售记录对象读入、比较 ISBN,并累计销售数量。
int add(int a, int b) { return a + b; }
int main() {
std::cout << add(2, 3);
}写一个程序,读取若干整数,输出它们的和、平均值和最大值。先用 while 读取,再用函数分别完成统计,最后故意输入一个字母观察流状态。
int x{}, sum{};
while (std::cin >> x) sum += x;
std::cout << sum;int x{}, sum{};
while (std::cin >> x) sum += x;
std::cout << sum;注释应该解释“为什么”,而不是把代码逐字翻译成中文。好的命名、短函数和清晰的控制流通常比大段注释更有价值。
// 只解释意图:输入失败时停止统计
while (std::cin >> value) total += value;同一个程序可以从键盘读,也可以从文件读。命令行重定向让测试数据与程序分离,非常适合验证输入输出程序。
std::ifstream in("data.txt");
std::streambuf* old = std::cin.rdbuf(in.rdbuf());
run();
std::cin.rdbuf(old);把问题拆成“读取一个单词、更新状态、输出结果”三个动作,能把看似复杂的程序变成一个循环和一个计数器。
std::string word;
std::map<std::string, int> counts;
while (std::cin >> word) ++counts[word];你应该能解释源文件、编译器、链接器、可执行文件的关系;能写输入输出和循环;能说出一个类把数据和操作放在一起的原因。
int main() {
// 入口:组织调用,而不是塞进所有细节
return 0;
}先自己回答,再展开解释。
编译、链接和运行分别做什么?
为什么 while (cin >> x) 能结束?
main 函数为什么返回 int?
输入读取失败后,变量里一定有新值吗?
完成本章后,建议进入第 2 章;也可以回到首页查看知识地图或打开交互实验。
输入一组整数,逐个 push_back,观察 size、capacity 和重新分配次数。