C教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 C程序结构

可见,为与其他语言相区别,C程序源文件通常是以“.c”为扩展名的。在C语言中,程序一般由编译预处理指令、数据或数据结构定义以及若干个函数组成。下面就如图1.6所示的程序代码来分析C程序的组成和结构。

图1.6 Ex_Sim.c的程序代码

1.2.1 main函数

代码中,main表示主函数。由于无论main函数在整个程序中处于什么位置,每一个程序执行时都必须从main开始,因此每一个C程序或由多个源文件组成的C项目都必须包含一个且只能有一个main函数。

在main函数代码中,“int main()”称为main函数的函数头(函数首部)。函数头下面是用一对花括号“{”和“}”括起来的部分,称为main函数的函数体。函数体中包括若干条语句(按书写次序依次顺序执行),每一条语句都用分号“;”结束,它是语句的一部分。函数名main的前面有一个int,它表示main 函数的类型是整型,须在函数体中使用关键字return将其后面的值作为函数的返回值。由于return语句运行后,函数体内部return后面的语句不再被执行,因此return语句一般写在函数体的最后。

在main函数体中,各行语句的含义如下:

第1条(行号6)语句用来定义两个双精度实型(double)变量r和area。即向编译系统申请开辟两块用于存取双精度实型数据的内存空间,变量名r和area分别是这两个内存空间的名称或标识。

第2条(行号7)语句调用在stdio.h中定义的库函数printf用来输出(C语言本身并不提供输出操作),双引号中的内容是printf的格式字符串,可含有由%引导的格式,其功能是按格式字符串的含义将结果输出到屏幕上。

第3条(行号8)语句调用在stdio.h中定义的库函数scanf进行输入(C语言本身并不提供输入操作),双引号中的内容是scanf的格式字符串,用来将用户输入的内容按格式字符串中指定的格式保存到后面的变量r所在的内存中,&r是取变量r的内存地址。当程序运行到此句时,程序暂停,等待用户输入。若输入10,则scanf根据“%lf”就将10这个数据按双精度实型的格式存储到由r命名的那个内存空间中。简单地说,此时变量r的值为10.000000。

第4条(行号9)语句是一条赋值语句,它先计算赋值运算符“=”右边的表达式“3.14159 * r * r”,然后将计算出的结果存储到由area命名的内存空间中。这就是说,此时变量area的值为314.159000。

第5条(行号10)语句和第2条语句一样都是调用库函数printf进行输出,与第2条语句不同的是,printf的格式字符串包含一个由%引导的格式“%f”,它的作用是使printf函数中的第2个参数(逗号后面的参数)area中存储的值314.159000以浮点形式填充在格式字符串中的“%f”位置处,这样字符串“圆的面积为:%f”就变成了“圆的面积为:314.159000”。另外,printf的格式字符串的最后还有一个“\n”,它的含义不是字符“n”的含义,而是在此处按Enter键换行,这样的字符称为转义字符

第6条(行号11)语句是一条库函数调用语句。为了能像Visual C++ 6.0那样可以看到最后的结果,若使用其他C语言开发工具,则一般应在程序代码中的最后一句“return 0;”之前加上一句代码:“getch();”。getch是一个在conio.h头文件中定义的库函数(以后会讨论),用来获取当前单个字符(不用按Enter键确认)。这样,当程序执行到此句代码时,就会等待用户的键盘输入,按任意键(除Shift键,Alt键和Ctrl键之外)即可返回。

最后一条语句的含义前面已做过说明,这里不再重复。于是程序的结果为

输入圆的半径:10 ↵
圆的面积为:314.159000

在以后的C程序运行结果中,本书不再完整显示其控制台窗口,仅将控制台窗口中运行结果部分裁剪下来列出,并加以单线阴影边框。另外,凡有下画线的数据表示是通过键盘输入,书中出现的“↵”表示按一下Enter键,本书做此约定

事实上,C程序的基本结构就是函数,所以有时又称C是函数式语言。而语句则是C程序的基本单位,具有独立的程序功能。在书写时,一行可以写上多条语句,也可以一条语句分几行书写,但每条语句都必须以分号“;”结束。语句和语句之间,行与行之间都可以有多个或多行空格。

1.2.2 头文件的包含

在如图1.6所示的Ex_Sim.c源程序中,行号2行号3的代码是C文件包含(#include)的编译指令,称为预处理指令。#include后面的stdio.h和conio.h是C编译器自带的文件,称为C库文件。其中,stdio.h定义了标准输入/输出的相关数据及其操作(在英文中,标准译为standard,输入/输出译为input/output,这样就解释了stdio.h的含义),而conio.h则定义了与控制台(console,con)相关的输入/输出操作。由于程序用到了输入/输出库函数printf和scanf以及控制台键盘操作函数getch。因而需要用#include将stdio.h和conio.h合并到程序中,又由于它们总是被放置在源程序文件的起始处,所以这些库文件被称为头文件(Header File)。事实上,C编译器自带了许多这样的头文件,每个头文件都支持一组特定的“工具”,用于实现基本输入/输出、数值计算、字符串处理等方面的操作。

在C语言中,头文件包含有两种格式。一种是将文件名用尖括号“<>”括起来,用来包含那些由编译系统提供的并放在指定子文件夹中的头文件,称为标准方式。另一种是将文件名用双引号括起来的方式,称为用户方式。以这种方式,系统先在用户当前工作文件夹中查找要包含的文件,若找不到再按标准方式查找(即再按尖括号的方式查找)。一般来说,用尖括号的方式来包含编译器自带的头文件;用双引号来包含用户自己编写的头文件,以节省查找时间。

1.2.3 注释

在前面的源程序中,“/*……*/”之间的内容都是用来注释的,它的目的只是为了提高程序的可读性,对编译和运行并不起作用。正是因为这一点,所以注释的内容既可以用汉字来表示,也可以用英文来说明,只要便于理解就行。

一般来说,注释应在编程的过程中同时进行,不要指望程序编制完成后再补写注释。那样只会多花好几倍的时间,更为严重的是,时间久了甚至会读不懂自己写的程序。

需要说明的是

(1)“/*……*/”可用来实现多行的注释,它使编译器将由“/*”开头到“*/”结尾之间所有内容均视为注释,称为块注释。块注释(“/*……*/”)的注解方式可以出现在程序中的任何位置,包括在语句或表达式之间。

(2)ANSI/ISO C90还支持由“//”引导的注释方式,它使编译器将“//”开始一直到行尾的内容作为注释,称为行注释。Visual C++支持此注释方式,但Turbo C 2.0不支持。