章节介绍
欢迎来到这些 C++ 教程的第一个主要章节!
在本章中,我们将初步了解许多对每个 C++ 程序都至关重要的话题。由于要涵盖的话题很多,我们大部分将浅尝辄止(刚好够用)。本章的目标是帮助你理解基本的 C++ 程序是如何构建的。到本章结束时,你将能够编写自己的简单程序。
在未来的章节中,我们将重新审视这些话题中的大部分,并更详细地探讨它们。我们还将引入在此基础上构建的新概念。
为了使课程长度适中,话题可能会分成几个后续课程。如果你觉得某个重要的概念在某节课中没有涵盖,或者你有一个问题在当前课程中没有得到解答,那它可能在下一节课中会得到涵盖。
语句
计算机程序是一系列指示计算机做什么的指令。**语句**是一种指令,它使程序**执行某种动作**。
语句是 C++ 程序中最常见的指令类型。这是因为它们是 C++ 语言中最小的独立计算单元。在这方面,它们的作用很像自然语言中的句子。当我们要向另一个人传达一个想法时,我们通常用句子(而不是随机的单词或音节)来书写或说话。在 C++ 中,当我们要让程序做某事时,我们通常编写语句。
C++ 中大多数(但不是所有)语句都以分号结尾。如果你看到一行以分号结尾,那它很可能是一个语句。
在 C++ 这样的高级语言中,一个单独的语句可能会编译成许多机器语言指令。
致进阶读者
C++ 中有许多不同类型的语句
- 声明语句
- 跳转语句
- 表达式语句
- 复合语句
- 选择语句(条件语句)
- 迭代语句(循环)
- try 块
到你完成这个系列教程的时候,你将理解所有这些是什么!
函数和 `main` 函数
在 C++ 中,语句通常被组织成称为函数的单元。**函数**是按顺序(从上到下)执行的语句集合。当你学习编写自己的程序时,你将能够创建自己的函数,并随意组合语句(我们将在未来的课程中展示如何做)。
规则
每个 C++ 程序都必须有一个名为 **main** 的特殊函数(所有字母都小写)。
当程序运行时,`main` 内部的语句将按顺序执行。
程序通常在 `main` 函数内部的最后一条语句执行完毕后终止(结束运行)(尽管程序在某些情况下可能会提前中止,或者之后进行一些清理工作)。
函数通常被编写来完成特定的工作或执行一些有用的操作。例如,一个名为 `max` 的函数可能包含语句来找出两个数字中哪个更大。一个名为 `calculateGrade` 的函数可能根据一组考试分数计算学生的成绩。一个名为 `printEmployee` 的函数可能将员工信息打印到控制台。我们很快会更多地讨论函数,因为它们是程序中最常用的组织工具。
命名法
在讨论函数时,在函数名称末尾附加一对括号是很常见的简写方式。例如,如果你看到术语 `main()` 或 `doSomething()`,这是分别表示名为 `main` 或 `doSomething` 的函数的简写。这有助于将函数与其他具有名称的事物(如变量)区分开来,而无需每次都写“函数”这个词。
在编程中,函数(或对象、类型、模板等)的名称称为其**标识符**。
字符和文本
最早的计算机主要是为数学计算和数据处理而设计的。随着硬件的改进,网络变得普及,消费者软件的发展,计算机也成为了书面交流的重要工具。
在书面语言中,最基本的交流单位是字符。简单来说,**字符**是一个书写符号或标记,例如字母、数字、标点符号或数学符号。当我们敲击键盘上的字母或数字键时,会产生一个字符,然后可以在屏幕上显示。以下都是字符:`a`、`2`、`$` 和 `=`。
在许多情况下,例如在书写单词或句子时,我们希望使用多个字符。一系列字符称为**文本**(在编程语境中也称为**字符串**)。
命名法
通常,“文本”一词也指**纯文本**,即只包含标准键盘上出现的字符,没有特殊格式或样式的文本。例如,纯文本不能表示粗体字,因为这需要样式。
我们的 C++ 程序是作为纯文本编写的。
致进阶读者
计算机还有一种额外的字符类型,称为“控制字符”。这些字符对计算机系统具有特殊含义,但要么不打算显示,要么显示为单个可见符号以外的东西。众所周知的控制字符示例包括“转义”(不显示任何内容)、“制表符”(显示为一定数量的空格)和“退格”(擦除前一个字符)。
相关内容
我们在课程 1.5 -- iostream 简介:cout、cin 和 endl 中讨论字符和文本的输出。
我们将在课程 4.11 -- 字符 中更详细地讨论字符(包括控制字符)。
剖析 Hello world!
既然你已经对语句和函数有了简要的了解,让我们回到“Hello world”程序,更详细地从宏观角度看看每一行做了什么。
#include <iostream>
int main()
{
std::cout << "Hello world!";
return 0;
}
第 1 行是一种特殊类型的行,称为预处理器指令。此 `#include` 预处理器指令表示我们希望使用 `iostream` 库的内容,这是 C++ 标准库的一部分,它允许我们从控制台读取和写入文本。我们需要此行才能在第 5 行使用 `std::cout`。如果省略此行,第 5 行将导致编译错误,因为编译器否则将不知道 `std::cout` 是什么。
第 2 行为空行,编译器会忽略它。此行仅用于帮助使程序更具可读性(通过将 `#include` 预处理器指令和程序的后续部分分开)。
第 3 行告诉编译器我们将编写(定义)一个名为 `main` 的函数。如上所述,每个 C++ 程序都必须有一个 `main` 函数,否则将无法链接。此函数将产生一个类型为 `int`(整数)的值。
第 4 行和第 7 行告诉编译器哪些行属于 *main* 函数。从第 4 行的开括号到第 7 行的闭括号之间的所有内容都被视为 `main` 函数的一部分。这被称为函数体。
第 5 行是 `main` 函数中的第一个语句,也是我们运行程序时将执行的第一个语句。`std::cout`(代表“字符输出”)和 `<<` 运算符允许我们在控制台上显示信息。在这种情况下,我们正在显示文本 `Hello world!`。这个语句创建了程序的可见输出。
第 6 行是一个 return 语句。当一个可执行程序运行结束时,程序会向操作系统返回一个值,以指示它是否成功运行。这个特定的 return 语句向操作系统返回整数值 `0`,这意味着“一切正常!”。这是程序中最后执行的语句。
我们编写的所有程序都将遵循这个通用模板,或者它的一个变体。
作者注
如果上述解释的部分(或全部)令人困惑,这是意料之中的。这只是为了提供一个快速概览。后续课程将深入探讨所有上述主题,并提供大量额外的解释和示例。
你可以自己编译并运行这个程序,你将看到它向控制台输出以下内容
Hello world!
如果你在编译或执行此程序时遇到问题,请查看课程 0.8 -- 几个常见的 C++ 问题。
语法和语法错误
在英语中,句子是根据你在学校英语课上可能学过的特定语法规则构建的。例如,在书写中,普通句子以句号结尾。描述特定单词(和标点符号)如何排列以形成语言中有效句子的规则集称为**语法**。例如,“My house painted is blue”是一个语法错误,因为单词的顺序不合常规。“All your base are belong to us!”是另一个著名的例子。
C++ 编程语言也有其语法,它描述了程序的元素必须如何编写和排列才能使程序被认为是有效的。当你编译程序时,编译器负责确保你的程序遵循这些语法规则。如果你的程序做了与语言语法相悖的事情,编译器将停止编译并发出一个**语法错误**。
与允许大量模糊性的英语不同,C++ 的语法规则是严格定义和遵守的。语法错误很常见。幸运的是,这类错误通常很容易找到和修复,因为编译器通常会直接指出它们。程序的编译只有在所有语法错误都解决后才能完成。
由于大多数语句的语法要求这些语句以分号结尾,让我们看看如果我们在“Hello world”程序的第 5 行省略分号会发生什么,就像这样
#include <iostream>
int main()
{
std::cout << "Hello world!"
return 0;
}
随意自行编译这个格式不正确的程序。
使用 Clang 编译时,会生成以下错误消息
prog.cc:5:31: error: expected ';' after expression
Clang 告诉我们,在第 5 行的第 31 个字符处,语法规则要求一个分号,但我们没有提供。因此,编译因错误而停止。
如果使用 Visual Studio 编译,编译器会产生此编译错误
c:\vcprojects\hello.cpp(6): error C2143: syntax error : missing ';' before 'return'
请注意,Visual Studio 说错误是在第 6 行(而不是第 5 行)遇到的。那么谁是对的呢?在某种程度上,两者都是。
Clang 知道我们通常在语句末尾放置分号,因此它根据我们这样做的假设报告错误在第 5 行。Visual Studio 则选择报告它在编译时确定错误发生的行(第 6 行,当它遇到 `return` 而不是预期的分号时)。
关键见解
编译器有时会报告错误发生在通常我们会修复问题的下一行。如果你在指示的行上找不到错误,请检查前一行。
要查看其他不同的错误消息,请尝试从“Hello world”程序中删除字符甚至整行。还可以尝试恢复第 5 行末尾缺失的分号,然后删除第 1、3 或 4 行,看看会发生什么。
小测验时间
以下测验旨在加深你对上述材料的理解。
问题 #1
什么是语句?
问题 #2
什么是函数?
问题 #3
所有程序必须包含的函数名称是什么?
问题 #4
程序运行时会发生什么?
问题 #5
C++ 中的语句通常以什么符号结尾?
问题 #6
什么是语法错误?
问题 #7
C++ 标准库是什么?