语句和程序的结构

章节介绍

欢迎来到这些C++教程的第一个主要章节!

在这一章中,我们将首次深入了解许多对每个C++程序都至关重要的主题。因为有相当多的主题要覆盖,我们将在相对浅显的层次上覆盖大多数主题(只讲到足够理解的程度)。本章的目标是帮助你理解基本的C++程序是如何构建的。到本章结束时,你将能够编写自己的简单程序。

在后续章节中,我们将重新审视这些主题的大部分,并更详细地探索它们。我们还将引入建立在这些基础之上的新概念。

为了保持课程长度的可管理性,主题可能会分散在随后的几个课程中。如果你觉得某个重要概念在课程中没有被覆盖,或者你有一个当前课程没有回答的问题,它可能在下一个课程中被覆盖。

语句

计算机程序是一系列告诉计算机要做什么的指令。语句是一种指令,它使程序执行某些动作。

语句是C++程序中最常见类型的指令。这是因为它们是C++语言中最小的独立计算单元。在这方面,它们的行为很像自然语言中的句子。当我们想向另一个人传达一个想法时,我们通常用句子来写或说(而不是随机的单词或音节)。在C++中,当我们想让我们的程序做某事时,我们通常编写语句。

大多数(但不是全部)C++语句以分号结尾。如果你看到一行以分号结尾,它很可能是一个语句。

在C++这样的高级语言中,一个单独的语句可能会编译成许多机器语言指令。

高级读者

C++中有多种不同类型的语句:

  • 声明语句
  • 跳转语句
  • 表达式语句
  • 复合语句
  • 选择语句(条件)
  • 迭代语句(循环)
  • 尝试块

当你完成这个教程系列时,你将理解所有这些!

函数和main函数

在C++中,语句通常被分组到称为函数的单元中。函数是按顺序执行的语句集合(从上到下)。当你学会编写自己的程序时,你将能够创建自己的函数,并以任何你喜欢的方式混合和匹配语句(我们将在将来的课程中展示如何做到这一点)。

规则

每个C++程序都必须有一个名为main的特殊函数(全部小写字母)。

当程序运行时,main内的语句按顺序执行。 程序通常在函数main中的最后一个语句执行完毕后终止(尽管在某些情况下程序可能会提前终止,或者之后进行一些清理工作)。

函数通常被编写来完成特定的工作或执行一些有用的动作。例如,一个名为max的函数可能包含计算两个数字中哪个更大的语句。一个名为calculateGrade的函数可能根据一组考试成绩计算一个学生的等级。一个名为printEmployee的函数可能会将员工的信息打印到控制台。我们很快就会更多地讨论函数,因为它们是程序中最常用的组织工具。

术语

在讨论函数时,一种常见的简写是在函数名称的末尾附加一对括号。例如,如果你看到main()或doSomething()这样的术语,这是分别指名为main或doSomething的函数的简写。这有助于区分函数和其他有名称的事物(如变量),而不必每次都写上"函数"这个词。

在编程中,函数(或对象、类型、模板等)的名称被称为它的标识符。

字符和文本

最早的计算机主要设计用于数学计算和数据处理。随着硬件的改进、网络的可访问性和消费者软件的发展,计算机也成为书面交流的宝贵工具。

在书面语言中,最基本的交流单位是字符。稍微简化一下,字符是一个书面符号或标记,如字母、数字、标点符号或数学符号。当我们在键盘上敲击字母或数字键时,会产生一个字符,然后可以在屏幕上显示。以下是所有字符:a、2、$和=。

在许多情况下,比如写单词或句子时,我们希望使用多个字符。字符序列被称为文本(在编程上下文中也称为字符串)。

术语

传统上,“文本"一词也用来表示纯文本,这是一种只包含标准键盘上出现的字符的文本,没有特殊的格式化或样式。例如,纯文本不能表示粗体字,因为那需要样式。

我们的C++程序是作为纯文本编写的。

高级读者

计算机有一种额外类型的字符,称为"控制字符”。这些字符对计算机系统有特殊含义,但要么不打算显示,要么显示的不是单个可见符号。一些众所周知的控制字符包括"转义"(不显示任何内容)、“制表符”(显示为一些空格)和"退格"(擦除前一个字符)。

解剖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行是一个返回语句。当可执行程序完成运行时,程序会向操作系统发送一个值,以指示它是否成功运行。这个特定的返回语句向操作系统返回整数0,意味着"一切都很好!"。这是程序中执行的最后一个语句。

我们编写的所有程序都将遵循这个通用模板,或其变体。

语法和语法错误

在英语中,句子是根据特定的语法规则构建的,你很可能在学校的英语课上学过这些规则。例如,在写作中,正常的句子以句号结尾。描述特定单词(和标点)如何排列以形成语言中有效句子的规则集称为语法。例如,“我的房子画成蓝色"是一个语法错误,因为单词的顺序是非传统的。“你们的所有基地都属于我们!“是另一个值得注意的例子。

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行,看看会发生什么。

库文件是已经"打包"好的预编译代码集合,用于在其他程序中重用。C++标准库是随C++一起提供的库。它包含可以在你的程序中使用的额外功能。

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"