2.1 第一个C++程序

2.1.1 C++程序的组成

C++源自C语言,因此,一个完整的C++程序跟C语言程序一样,通常由预处理指令部分、全局变量和函数声明部分、主程序部分[main()函数]这3个部分组成,如图2.2所示。所有的C++程序都是从main()函数开始执行的。

图2.2 C++程序的组成

除此之外,为了方便阅读、理解和使用代码,可以给代码添加注释,注释部分不会被执行,也不会对程序造成任何影响。与C语言程序不同,C++程序的预处理指令部分多了一个命名空间的指令。

编程案例

案例2.1

编写程序,输出一行文本“我的第一个C++程序!”。

程序代码2.1

01  /* 
02  输出一行文本“我的第一个C++程序!”。
03  */
04  #include <iostream> //预处理指令部分,包含头文件iostream
05  using namespace std;      //使用标准命名空间std
06  int main()                //定义main()函数 
07  {
08      cout <<"我的第一个C++程序!"<< endl;  //输出并换行
09      return 0;
10  }

以上程序代码中,第01~第03行是用“/*”和“*/”围起来的注释部分;第04行是预处理指令部分,包含了头文件iostream;第05行使用了标准命名空间std;第06~第10行是主程序部分,它是一个main()函数,任何一个C++程序都必须包含一个main()函数。

程序运行结果如图2.3所示。

图2.3 程序运行结果

2.1.2 预处理指令

预处理指令是出现在C++程序开始位置、以“#”开头的内容。C++程序中常用的预处理指令有两种:一种是#define,用于定义常量;另一种是#include,用于导入文件。

#define指令的常用形式如下:

#define 标识符 字符串

例如,下面的代码用#define指令定义了一个常量PI:

#define PI 3.1415926 //定义一个常量PI,其值为3.1415926

#include指令的常用形式如下:

#include <文件名> //一般用来导入库文件
#include "文件名" //常用来导入用户自己编写的文件

例如,下面的代码用#include指令在程序中包含头文件iostream:

#include <iostream> //包含头文件iostream

C++程序中最常用的文件包含命令为#include <iostream>。C++在iostream中设置了常用的输入输出环境、输入输出流对象(cin、cout等)。头文件iostream把C++标准程序库中的所有标识符都定义在一个名为std的命名空间里面,所以要使用头文件iostream,需要在程序中添加命名空间,代码为“using namespace std;”。

2.1.3 std命名空间

命名空间即namespace,也可以称为名称空间。它的主要作用是解决名字冲突。命名空间实际上是由程序设计者定义的一个内存区域,其中定义了许多名称(标识符),分别表示不同的含义和功能,如果要在程序中使用这些名称,就需要添加该命名空间。

由于C++标准程序库中所有的标识符都定义在一个名为std的命名空间中,因此C++程序通常都要添加代码“using namespace std;”,这样std命名空间中定义的所有标识符在该程序中就都有效。常用的标准输入输出流对象cin和cout就被定义在std命名空间中。

2.1.4 main()函数

使用C++编程时,我们可以把执行某个特殊任务的指令和数据从程序的其余部分分离出去,使其单独成为一个程序块,为其取一个名字,通常把这种程序块称为函数,给它取的名字就是函数名。可以在程序其余部分用函数名多次重复调用对应的函数。

所有的C++程序实际上都是由一个或多个函数构成的。C++程序中最重要的部分就是main()函数,在需要的时候可在main()函数中调用其他函数。下面的程序代码展示了在main()函数中调用其他函数的过程:

int main()                //main()函数(每一个C++程序都必须包含它)
{                                        //函数体开始符
float pi;
scanf("%f",&pi);                     //调用scanf()函数
printf("圆周率约等于%.2f\n",pi);       //调用printf()函数
pi = round(pi);                       //调用round()函数
return 0;                             //函数返回值 0
}                                         //函数体结束符

计算机会从main()函数开始运行程序代码。如果一个C++程序中没有main()函数,程序就无法启动。

上面的程序代码中main()前面的int是指main()函数返回值的类型是整数。这是什么意思呢?当计算机在运行程序时,它需要一些方法来判断程序是否运行成功,计算机正是通过检查main()函数的返回值来判断的。如果main()函数返回整数0,就表明程序运行成功;如果返回其他整数值,就表示程序在运行时出了问题。main()函数的返回值是由程序中的return语句实现的,通常情况下,一个C++程序的main()函数的最后一条语句就是“return 0;”。

函数名“main”在返回值类型int之后出现。如果函数在被调用时需要事先提供一些数据(参数),那么可以写在函数名后面的括号里面。最后是函数体,也就是该函数要执行的各条指令和用到的数据,函数体必须用花括号“{”和“}”围起来。

C++程序中最主要的部分就是main()函数,那么main()函数内部是什么样子的呢?

main()函数内部其实就是按顺序排列的一条条指令和相关数据,在程序设计语言中,这样的内容称为语句。C++程序为了区分每一条语句,避免计算机混淆,在每一条语句末尾加上“;”表示结束。当把多条语句组合在一起,用来完成某一项任务时,这些语句被称为语句块。语句块和main()函数的函数体一样,要用花括号“{”和“}”围起来。

2.1.5 cout输出语句

cout语句是C++的输出语句,C++的输出和输入是用“流”(Stream)的方式实现的。看到“流”我们自然会想到水流,水在一个长长的玻璃管中总是以一种“先进先出”的方式流进流出。C++在处理输出和输入内容时,也以“先进先出”的方式按其字节序列的先后顺序进行处理,这个过程分别称为流输出和流输入,输出和输入内容的字节序列称为字节流。

如果字节流从设备(如键盘、磁盘驱动器等)流向内存,就叫作输入操作(流输入)。如果字节流从内存流向设备(如显示器、打印机、磁盘驱动器等),就叫作输出操作(流输出)。

要在程序中使用cout语句,必须在预处理指令部分添加代码“#include <iostream>”。cout在头文件iostream中被定义为标准输出流,其作用是将字节流输出到标准输出设备(通常是显示器)。cout语句和流插入运算符“<<”结合使用,如图2.4所示。

图2.4 cout语句和流插入运算符

cout语句的一般格式如下:

cout << 项目1 << 项目2 <<  <<项目n; 

如果“<<”后面的项目是加引号的,则输出引号内的内容;如果“<<”后面是endl,则输出换行,作用等同于加引号的“\n”。例如:

cout <<"我的第一个C++程序!\n";  //输出“我的第一个C++程序!”并换行

输出内容如下:

我的第一个C++程序!
 

如果“<<”后面的项目是某种表达式,则输出该表达式的值。例如:

cout << 10+20 << endl;         //输出“30”并换行 

输出内容如下:

30
 

2.1.6 注释

注释是程序员为代码标注的解释或提示,以便自己和其他程序员能够快速看懂代码。编程时为代码添加详细的注释可以提高代码的可读性。注释中的所有内容都会被C++编译器忽略。

C++支持单行注释和多行注释。

单行注释以“//”开始,直到该行结束。例如:

cout <<"我的第一个C++程序!"<< endl;  //输出并换行 

多行注释以“/*”开始,以“*/”结束,它们之间的所有内容都是注释内容。例如:

/* 
 输出一行文本“我的第一个C++程序!”。
 曙光工作室 版权所有 
 2021-11-12
*/

2.1.7 常见错误

对初学者来说,由于刚接触C++编程,写出的程序代码难免会出现一些错误,并且当错误出现时还不知道是怎么回事,也不知道该怎么修改。下面对初学者经常遇到的一些错误进行说明。

(1)语句中出现中文符号。

C++程序代码是用英文编写的,代码中的所有命令符号都必须是英文符号(半角),不能是中文符号(全角),中文符号只能作为字符串出现在半角双引号中。例如:

cout << HELLO” ; //错误代码
cout << "我的第一个C++程序!" ; 

对比上面两行代码,可以发现第一行中的引号为中文符号,这在C++程序中是不允许的,编译器对此无法识别,编译时会出现图2.5所示的错误提示。

图2.5 语句中出现中文符号时编译器出现的错误提示

(2)语句末尾缺少分号。

C++语法规定每条语句必须以分号结束,分号是C++语句中不可缺少的一部分。如果语句末尾缺少分号,编译时就会出错。例如:

cout << "HELLO" //错误代码

对以上代码进行编译,会出现图2.6所示的错误提示。

图2.6 语句末尾缺少分号时编译器出现的错误提示

(3)程序预处理指令部分缺少某个头文件。

C++提供了许多功能各异的函数和方法,要使用它们,就必须在程序预处理指令部分包含相应的头文件。例如:

pi = round(3.1415926);     //调用数学函数round()进行四舍五入 

上面的代码中使用了数学函数round(),必须用“#include <cmath>”包含cmath头文件,如果没有包含该头文件,编译时会出现图2.7所示的错误提示。

图2.7 程序预处理指令部分缺少头文件时编译器出现的错误提示

此处提示round()函数没有被声明,因为round()函数声明在cmath头文件中,所以程序中必须包含cmath头文件。另外,此处的错误提示和变量没有被声明时的错误提示是一样的。本书将在后面的章节详细讲解什么是变量。C++规定程序中所有的变量都要被声明过才可以使用。

编程案例

案例2.2

编写程序,输出由“*”组成的图 2.8所示的图案。

图2.8 输出由“*”组成的图案

程序代码2.2

01 /* 
02 输出由“*”组成的图案。
03 */
04 #include <iostream>
05 using namespace std;
06 int main()
07 {
08      cout << "*" <<endl;
09      cout << "**" <<endl;
10      cout << "***" <<endl;
11      cout << "****" <<endl;
12      cout << "*****" <<endl;
13      return 0;
14 }

以上程序代码中,第08~第12行中的每一行都用cout语句输出一串“*”,并用endl换行。

程序运行结果如图2.9所示。

图2.9 程序运行结果

编程训练

练习2.1

编写程序,按如下格式输出古诗《春晓》。

春 晓

[唐]孟浩然

春眠不觉晓,处处闻啼鸟。

夜来风雨声,花落知多少。