跳至内容
Topos Uranos

摘要

本课把最小的 C++ 程序拆成若干部分,并说明每一部分的作用。包含指令声明程序依赖库的哪些部分,每个组件都要求包含自己的头文件,即使有时另一个头文件会把它“间接”带进来;函数 main 是入口点,它的返回值就是系统收到的退出码;命名空间 std 汇集了库中的名字,本课程总是连同前缀一起书写它们;语句以分号结束,花括号把语句组成块,注释说明代码本身没有说出的东西。本课最后介绍本课程所有程序都遵循的风格指南,以及如何阅读使用 std::cout 和 std::endl 的他人代码。

学习目标

  1. 在程序中辨认包含指令、函数 main、语句、块和注释,并说明各自的作用。
  2. 解释 #include 做什么,以及为什么库的每个组件都要求包含自己的头文件,即使在某个特定编译器上程序不包含它也能编译。
  3. 根据编译器的消息(从第一条读起),改正有结构错误(花括号未闭合、缺少分号、漏掉头文件)的程序。
  4. 按本课程的风格指南改写程序,并说明每处修改的理由。

最小的程序

在前一课中,我们编译并运行了一个程序,却没有细看它。现在逐行阅读它,因为每一行都回应一项不同的要求:一行出自语言,一行出自操作系统,一行出自阅读代码的人。程序如下。

C++ 程序
// 第一个程序:输出一行,然后结束。#include <print>​int main(){    std::println("你好,世界");}
输出
你好,世界

第一行是注释:它以两个斜杠开始,一直延续到行尾,编译器会丢弃它;它是写给阅读程序的人看的。第二行是包含指令:它要求在编译之前纳入头文件 <print>,标准库在其中声明了 std::println。空行没有任何作用;它把程序的准备部分与内容分开。第四行开启函数 main,即执行开始的地方,第五行的花括号开启它的块,这个块在最后一行闭合。块内只有一条语句,以分号结束:对 std::println 的调用,它输出引号之间的文本,然后换行。

应当注意,程序中没有任何让它结束的命令。执行到达 main 的最后一个花括号时就结束了,程序会告诉系统一切顺利;下文会说明这是怎样做到的。由此可知,五种部分就足以构成一个完整的程序:注释、指令、函数 main、块和语句。以下各节按这个顺序考察它们,只有注释与语句和块放在一起讲。

例题逐一看各个部分

在问候程序中,指令是第 2 行;函数 main 占据第 4 行到第 7 行;它的块从第 5 行的花括号延伸到第 7 行的花括号;唯一的语句是第 6 行,唯一的注释是第 1 行。删去注释,程序照样编译,输出也一样;删去其他任何部分,程序就不再能编译,或者不再是一个程序。