2.1 C语言的运行特征
在计算机中,程序是被逐句执行的,在C语言程序中,即使再简单的一段C语言程序,也会包含最基本的组成部分,如函数首部、函数体、输出函数等,本节就来介绍C语言的运行特征。
2.1.1 简单的C语言程序
C语言程序主要包括预处理器指令、函数、变量、语句&表达式、注释等内容,下面通过几个使用C语言编写的实例,来了解一下C语言程序的主要组成部分。
【例2.1】编写程序,实现在屏幕中输出Hello World!(源代码\ch02\2.1.txt)。
图2-1 例2.1的程序运行结果
程序运行结果如图2-1所示。
程序说明如下:
(1)#include:称为“文件包含命令”,其作用是把系统目录下的头文件<stdio.h>包含到本程序中,成为程序的一部分,并告诉C语言编译器在实际编译之前要包含stdio.h文件。
C语言提供的头文件中包含各种标准库函数的函数原型,在程序中调用某个库函数时,就必须将该函数原型所在的头文件包含进来。本程序包含的头文件是stdio.h(stdio是standard input&output(标准输入/输出)的缩写),该文件中的函数主要用于处理数据流的标准输入/输出。
(2)main():主函数的名字,每一个C语言程序只允许有一个主函数;主函数之前的void表示此主函数是空类型,即执行此函数后不产生一个函数值。
(3)/*…*/:表示注释语句,即程序中的说明文字,是不被C语言系统执行的语句。位于/*和*/之间的所有内容都属于注释语句,可以写在一行之内,也可以写在多行之内。
(4)printf():C语言系统库函数,其函数原型在头文件stdio.h中,该函数的功能是将其小括号中的内容输出到显示器上,其小括号中双引号里的内容会被按原样输出,其中的“\n”是换行符。
(5)主函数中的内容必须放在函数体中,即主函数下方的一对花括号中。
(6)return():终止主函数,并返回值0。
☆大牛提醒☆
包含头文件的命令尽量不要忽略,虽然有的时候不影响程序的运行,但希望学习者在开始学习的时候就能养成良好的编程书写习惯。另外,主函数之前的void可以忽略不写。
【例2.2】编写程序,求10以内的偶数的和(源代码\ch02\2.2.txt)。
图2-2 例2.2的程序运行结果
程序运行结果如图2-2所示。
程序说明如下:
(1)在主函数里定义了一个整型变量sum。
(2)语句“sum=2+4+6+8+10;”是将表达式“2+4+6+8+10”的计算结果赋给变量sum。
(3)语句“printf("sum=%d\n", sum);”是将变量sum的结构输出到计算机屏幕上,其中,双引号中的格式字符%d对应的是双引号之后的变量sum的值。
☆大牛提醒☆
本程序中printf()的双引号里出现了格式字符%d,其作用是输出一个整数类型的值,输出的对象是位于双引号之后的整型变量sum。
【例2.3】编写程序,求两个整数中的最大值(源代码\ch02\2.3.txt)。
图2-3 例2.3的程序运行结果
程序运行结果如图2-3所示。
程序说明如下:
(1)本程序中包含两个函数,主调函数main()和被调函数max()。函数max()的作用是判断x和y中的较大值。函数max()中的return语句将z的值返回给主调函数main(),返回值通过函数名max带回到函数main()中调用max函数的位置。
(2)程序的第2行是对函数max()的声明。
(3)程序的第8行调用函数max(),在调用时将实际参数a和b的值分别传给函数max()中的形式参数x和y,经过执行函数max(),其返回值返回给函数main()中的变量c。
(4)程序的第9行输出变量c的值。
(5)程序的第11行至第17行是函数max()的具体定义。
2.1.2 C语言程序的结构
在前面给出了一些C语言程序实例,虽然结构和功能简单,但是都包含了C语言程序的基本组成部分,从中我们可以得出以下结论。
(1)C语言程序由函数构成。一个C语言程序必须包含一个主函数,或者一个主函数和若干个其他函数。因此,函数是C语言的基本单位,被调函数可以是系统函数,如函数printf(),也可以是用户自定义编写的函数,如函数max()。
(2)C语言程序的函数由两部分组成,即函数首部和函数体。
①函数首部,即函数的第一行,包括函数类型、函数名称、参数类型和参数名称。函数名称后面必须跟一对小括号,括号内写明函数的参数类型和参数名称,函数也可以没有参数,如main()。例2.3中的函数max()的首部为:
②函数体,即函数首部下方花括号内的部分,若函数体有多个花括号,则以最外层的一对花括号包含的内容为函数体的范围。
函数体一般包括两个部分。
· 声明部分。这部分要定义所要用到的变量和对所要调用的函数进行声明,例2.3中的主函数对变量的定义语句“int a, b, c;”。
· 执行部分。这部分由若干条语句组成。
在某些情况下也可以没有声明部分,例2.1中,我们也可以既无声明部分也无执行部分,语句如下:
void main( ) { }
这是一个空函数,什么也不执行。
(3)C语言程序总是从主函数开始执行,直至主函数中最后一条执行语句为止,与主函数的位置无关。
(4)C语言程序书写格式自由,一行内可以写若干条语句,一条语句也可以分写在多行上。
(5)每条语句和数据声明的最后都必须带一个分号,即使是程序中的最后一条语句也要带上分号。
通过以上内容的学习,我们可以了解到C语言程序的语法规则、基本表达式、控制结构语句的作用,并通过了解模块化程序设计的思想和方法,逐步掌握C语言程序的设计方法。
2.1.3 C语言程序的执行
用C语言编写的程序称为源程序,由于计算机只能识别和执行由0和1组成的二进制指令,为了使计算机能够执行编程语言的源程序,首先要将源程序翻译成二进制的“目标程序”,这个过程被称为“编译”。然后还要将目标程序和系统提供的函数与其他目标程序连接起来,得到计算机可以执行的程序,这个过程被称为“链接”。
1.编译源程序
C语言源程序的扩展名为.c,必须将其编译成目标程序,再将目标程序链接成可以执行程序,才能在计算机运行。C语言源程序的编译过程如图2-4所示,由词法分析、语法分析和代码生成三部分组成。
图2-4 C语言源程序的编译过程
2.链接目标程序
C语言源程序经过编译后所生成的目标程序尽管是机器语言的形式,但却不是计算机可以执行的方法,此时的目标程序还只是一些松散的机器语言,要想得到可执行的程序,就需要将它们链接起来。
编程语言的链接工作由链接器来完成,链接器的任务就是将目标程序链接成可执行的程序,这种可以执行的程序是一种可存储在磁盘存储器上的文件。
☆大牛提醒☆
(1)并不是每一个目标程序都可以链接成可执行程序。
(2)在应用系统中,只允许一个源程序中包含一个主函数。
C语言源程序一旦生成了可执行程序,就可以反复被加载执行,而不再需要重新编译、链接;如果修改了源程序,也不会影响已生成的可执行程序,需要对修改后的源程序重新编译和链接,生成一个新的可执行程序。