6.3 步骤2:函数的定义

6.3.1 函数定义的结构

函数定义(Function Definition)是指在代码中具体写出函数完成任务的步骤和方法。前面章节写main()函数,其实就是在写main()函数的定义。写其他函数的定义和写main()函数的过程基本是一样的(6),因为在C语言中所有函数的结构都是一样的,即都包括两部分——函数头和函数体。

6.3 步骤2:函数的定义 - 图1

函数类型 函数名(形参列表)这部分叫函数头(7)“{}”括起来的部分叫做函数体。“{}”内没有任何语句的函数叫空函数。在写程序的过程中,为了首先完整地搭建出符合语法要求的、正确的源程序框架,可以也应该首先写出若干空函数,然后再逐个、逐步地向其中添加内容。

从另一个角度看,由于函数调用是一个表达式,其中的“()”是一种运算符,写函数定义其实是在定义“函数名(……)”这种特定运算的运算规则。

6.3.2 函数定义的位置

C语言中所有函数的语法地位都是平等的,各个函数之间是平行的关系,因此各个函数定义的位置也是平行独立的,不允许在一个函数内写另一个函数的定义。确定函数定义位置的原则就是,在任何其他函数定义之外。一个典型的由多个函数组成的C语言源文件中函数定义的分布遵循下面的模式:

6.3 步骤2:函数的定义 - 图2

各个函数定义不存在顺序问题,但由于通常main()表达的是程序最主要的核心思想,因此把main()的定义放在所有其他函数定义的前面为宜,这样更方便程序的阅读。本书的代码即遵循这样的编程风格。

6.3.3 函数头的写法、形参

函数头部分和函数声明非常类似,所以实际编程时直接将已写好的函数声明复制过来加以适当编辑就可以了(注意函数头后面没有“;”)。

由于函数定义部分需要写出函数完成任务的具体步骤和方法,所以必须为函数所需要的各个参量取名,假设将qiuji函数所需要的两个参量分别命名为zs1和zs2,这样函数头部分就完成了。紧接着把函数体的“{}”写在后面,完成后的代码如下:

6.3 步骤2:函数的定义 - 图3

在函数被使用之前,zsl、zs2没有特别指定的值(8),并不是完成任务所需要的特定的具体参量,它们只是为了描述函数完成任务的步骤必须要有的形式上的两个名字,用来表示函数需要求积所需要的两个因子,因此被叫做形参(Formal Parameter)。形参只能在紧随其后的函数体中使用。

6.3.4 函数体的写法、return关键字

函数体内的内容描述了求函数所要求的值的具体步骤和方法。由于在函数头部分预先假定函数所需要的代表求乘积的两个乘数的参量分别是zsl和zs2,所以只要求出它们的积zs1×zs2就可以得到所需要的结果。这个结果并不是函数定义本身所需要的,而是使用函数的地方所需要的,因此需要把这个结果传递到使用函数的地方,完成这个功能需要用到关键字return

6.3 步骤2:函数的定义 - 图4

这样,qiuji()函数的定义就全部完成了。

关键字return的一般用法是:

return表达式

这个表达式的类型应该与函数的类型一致,否则可能引起不必要的麻烦或错误(9)

对于void类型的函数,由于不需要传递值回到使用函数的地方,可以在描述完函数所应该完成的任务之后直接写:

return;

它表示执行完函数体内的相应语句后,回到使用函数处继续执行。

如果函数体内没有return语句,函数体部分的所有语句执行完毕后,即执行到函数体的最后一个“}”时,返回使用函数的地方。对于非void类型的函数,这时返回的是一个不确定的值。

练习

写出函数定义,要求该函数能完成求一个由整数构成的等差数列的各项的和的功能。