C++ 自学教程 第1.1章 程序结构
一段电脑程序是一系列指令,这些指令告诉电脑下一步应该做什么。程序通常由以下三个基本元素组成:表达式(expression),叙述(statement)和函数(function)。
叙述
叙述(或译为述句)是最常见的程序指令。C++中的叙述是其语言的最小独立单位。可类比于人类语言中的句子,可单独用来表达某个概念。在C++中,我们用叙述来向编译器表达我们想要完成某项任务。C++中的叙述通常(但不是总是)以分号结尾。
C++中有不同种类的叙述。比方说下面这几个常见的例子:
int x;
x = 5;
std::cout << x;
int x;是声明性叙述(declaration statement)。这个叙述告诉编译器x是个变量,并用于存储一个整数值。在编程中,变量相当于某块可用于存储数值的内存区域的名字。程序中所有变量在使用之前都必须被声明。这点等下马上还会讲。
x=5; 这个叙述语句将数值5赋值给了变量x,以便我们之后使用。
std::cout << x; 这句叙述将变量x的数值输出在屏幕上。
表达式
编译器同样可以理解表达式。表达式定义了某个需要被完成的计算/算式。比方说,我们在孩童时学过2+3等于5,我们也说2+3是个表达式,它的结果是5。
下列是不同类型的表达式:
"Hello, world"
x
2 + 3
x = 5
(2+x)*(y-3)
std::cout << x
你可能会注意到表达式中可含有字面值(比方说2,也就是整数2,或者’Hello World’代表一段文本。)表达式同样可含变量(比如说x,其数值等于对应内存中存储的数值),数学运算符号(比如+,代表加法运算),还能调用函数(之后会提到)。
比方说 x = 5(不带分号)就是个有效表达式,它将数字5赋值给x。
表达式不能独立被编译,他们应该在叙述中被使用。再拿x=5举例,编译器不能编译这个表达式,可能会报错(缺少一个分号)。
幸运的是,将表达式转化为叙述非常简单。一个表达式叙述就是表达式后加一个分号。因此,当你在x=5后加一个分号,这段程序就可以成功编译了。
有意思的事,一个叙述中可以含有多个表达式。在未来的课程里你将看见很多这样的例子。
函数
在C++中,多个叙述常常被打包成一个单元,这个单元又被称为函数。函数是一系列被依次执行的叙述语句。每一个C++程序都必须包括一个特别的函数:主要函数(main)。当C++程序运行的时候,程序从main函数的第一个叙述开始被执行。函数通常用来执行某项特定任务。几个例子,函数max可能包含一系列叙述语句来判断两个数字中那个更大。一个被叫做‘calculateGrade’的函数可能被用于计算一个学生的分数。这点以后还会分析。
提示:推荐把你的主函数存保存在名为main.cpp的文件或者跟你的项目同名的.cpp文件。比如你想编写一个象棋程序,你的主函数最好保存在chess.cpp里面。
库与C++标准库。
库(library)是一系列被预先编译的代码(比如函数)合集。它被打包好以供不同项目使用。库为你提供了一个拓展你的程序能力的常见方法。比方说,如果你想编写一个游戏程序,你可能需要将处理声音和图形的函数库。
C++的核心语言非常精短而简练(所以这个教程能教给你大部分的核心)。但是C++同时自带一个被称为C++标准库的函数库。C++标准库被划分成不同区域(或子库)。每一个区域/子库提供某项专门功能。C++标准库中最常用的就是iostream子库,其中包含了用户能在屏幕上输入或者显示控制台输出的相关功能。
“解剖一段小程序”
现在你已经理解了什么是表达式,叙述,函数和库。让我们来看看‘Hello World’这段小程序。
#include <iostream>
int main()
{
std::cout << "Hello world!";
return 0;
}
第一行是一种特别叙述语句,又被称为预处理指令(preprocessor directives)。预处理指令让编译器执行某项特殊任务。在这个例子里面,它让编译器把iostream的头文件添加到我们的程序中,这样我们就可以使用iostream库里的各种函数,比如将文本输出到屏幕上。
第二行是分隔行,编译器会略过这行。
第三行声明了刚刚教过的主函数,这一步是必须的。每个程序都必须含有一个主函数。
第四行和第七行告诉编译器那一部分是主函数。在两个花括号之间的内容都被认为是主函数的组成部分。
第五行是第一个叙述(很明显,它的结尾是分号),也是个表达式叙述。std :: cout是个特别的对象,它代表着控制台/屏幕。<<符号是被称为输出算子的运算符号。std :: cout知道所有它接收的东西都应该被显示在屏幕上。在这个例子中,我们将文本’Hello world’输出给屏幕。
第六行是一种新的叙述,被称为返回值叙述。当一段可执行程序完成运行,主函数会向操作系统返回一个值。这个数值代表了程序是否成功运行。
这个返回值叙述将数值0返回给操作系统,也就是说“一切顺利!”。所有非零的数值通常都代表着有东西出错了,程序必须被中途终止。等下讨论函数的时候会讲到具体的。
未来我们写的程序都遵循这个模板,或者类似这个模板。
后面的章节会探讨每一行的具体细节。
语法和语法错误
你在学校可能学到过,在英语中,句子的构造遵从特定的语法规范。比方说句子用句号结尾。这种规范就被称为语法(syntax)。如果你写了两个句子中间没有用句号分隔,就是违背了英语的语法。
C++也有特定的语法:决定构建有效程序的规范。当你编译程序的时候,编译器有责任确保你的程序遵从了C++语法。如果你违背了任何规范,编译器会报错,也就是语法错误(syntax error )。
举个例子,你刚刚学过许多叙述都需要用分号结尾。
让我们看看如果我们省去一个分号会发生些什么:
#include <iostream>
int main()
{
std::cout << "Hello world!"
return 0;
}
Visual studio 会生成下面的错误警报:
c:\users\apomeranz\documents\visual studio 2013\projects\test1\test1\test1.cpp(6): error C2143: syntax error : missing ‘;’ before ‘return’
这个错误消息的意思是你在第六行有个语法错误:你在 返回值前面忘了个分号。在这个例子里错误其实在第五行。通常情况下编译器能精确定位错误。但是有时候它可能不到下一行都没意识到这里有一个错误。
语法错误在程序很常见。幸运的是,他们通常能被简单的修复。必须所有语法错误都被修正后程序才能被编译。
说明: 这系列笔记是基于网上一个英文教程LearnCPP。