首页 理论教育函数的定义和声明-《C语言程序设计基础》

函数的定义和声明-《C语言程序设计基础》

【摘要】:书写在特定函数内部时,用于向该函数声明被调用函数的特征,此时仅有书写了函数声明语句的函数知道被声明函数的存在。当被调函数与主调函数位于同一源文件,且被调函数的定义出现在主调函数之前时,不必对被调函数进行声明,其原因是编译系统此时已经知道了被调函数的所有特征。对被调函数不必进行声明的示例。

1.函数的定义

在C程序中,函数对应于某一特定功能,函数的定义就是编写实现这一功能的程序代码。C语言中函数定义的一般形式如下:

返回值类型名 函数名(类型名形参,类型名形参,…)

<函数体语句>

函数定义的形式中,最上面一行称为函数头(或函数首部),由函数返回值类型、函数名和形式参数表组成。它们的意义是:

①返回值类型名。任何一个非void类型的函数执行完成后都会得到一个具体数据,返回值类型名规定了这个返回数据的数据类型。函数执行后不需要返回值时,其类型应定义为void。C语言规定,定义返回值类型为int或char的函数时,返回值类型名可省略不写。

②函数名。用户为函数取的名字,程序中通过函数名来调用函数。除主函数main外,其他由用户自己用标识符进行命名。

③形式参数表。形式参数表示函数与外界打交道的数据通道,由零个到多个的形式参数组成,每个形式参数都由数据类型名和变量名两部分构成,参数之间用逗号分隔。一个函数即使没有形式参数,圆括号也不能省略。当函数被调用时,形式参数表中的参数从对应的实参获取数据。

C函数体由一对花括号括住,是函数实现具体功能的代码段,由零到若干条C语句构成。若函数是非void类型,函数体中必然存在返回语句。返回语句表达两方面含义:一是结束函数的调用(函数的执行);二是向调用者报告函数执行的结果。返回语句的形式为:

return 表达式;值得注意的是,一个函数执行结果的数据类型不是由返回语句中表达式数据类型决定的,而是取决于函数头中指定的返回值类型。两者不一致时,返回语句中表达式值被自动转换为函数头部指定的数据类型。

如果函数是void类型,函数体中可以没有返回的语句,此时函数体的右边花括号作为函数执行结束标志;也可以根据需要在函数体中使用仅由return构成的返回语句。例如,求某个整数阶乘的功能,可以定义如下C函数予以实现:

在函数体中可以存在多个返回语句用以表示函数执行结束的不同情况。例如,下面代码段表示了具有两种执行结束可能的函数:

//求两数之积或两数之和的函数定义

定义一个函数一般分为设计函数头和设计函数体两个步骤。设计函数头时,首先应该给函数取一个有意义的名字;其次可以把函数体想象成一个具有输入/输出的黑匣子,具体的功能实现被这个黑匣子隐藏起来,函数执行时需要从外界(函数的调用者)获取数据,根据这些数据的个数、次序、数据类型可以设计出对应的形式参数表;最后,根据函数执行后获得结果数据的类型来确定返回值类型。当一个函数所有的功能都在函数体内实现,不需要返回值时,返回值类型应定义为void。

在函数体的设计中,把形参当作已经初始化的变量直接使用,根据需要适当增加变量。对于函数体中求出的结果,一般不是直接输出,而是通过return语句返回给主调函数。(www.chuimin.cn)

例如,编写求两个正整数的最大公约数的函数。函数执行时的输入显然是两个正整数,说明形参是两个整型变量(假定用变量m和n表示);函数执行后的输出是整数表示的最大公约数,由此确定函数的返回值是整型;函数取名为gcd。函数定义如下:

/*求两个正整数最大公约数*/

C语言中规定,在一个函数的内部不能定义其他函数(即函数不能嵌套定义)。这个规定保证了每个函数都是一个相对独立的程序模块。在由多个函数组成的C程序中,各个函数的定义是并列的,并且在程序中的前后排列顺序也是任意的,函数在程序中前后排列的顺序与程序运行时函数的执行顺序没有任何关系。

2.函数的声明

C语言规定,程序中使用到的任何数据对象都要事先进行声明。对于函数而言,所谓“声明”是指向编译系统提供被调函数的必要信息:函数名,函数的返回值的类型,函数参数的个数、类型及排列次序,以便编译系统对函数的调用进行检查。例如,检查形参与实参类型是否一致,使用调用方式是否正确,等等。

标准库函数说明按类别集中在一些称为“头文件”的文本文件中,程序中要调用标准库函数时,只需要在程序的适当位置写上相应的文件包含预处理语句:#include<头文件名>或#include"头文件名",即可完成对标准库函数的声明。例如,程序中要调用输入输出标准库函数,使用的文件包含预处理语句是:

#include<stdio.h>或#inlcude"stdio.h"

声明自定义函数时,需要向编译系统提供函数的返回值类型、函数名和形式参数表的特征信息,声明语句的一般形式为:

返回值类型名函数名(类型名[形参],类型名[形参],…);

从函数声明的形式可以看出,函数声明就是描述出函数定义的头部信息。声明中描述函数形式参数表时,其中的参数个数、每个参数的类型、参数出现的次序都是非常重要的,但参数的名字是无关紧要的。例如,声明前面设计的gcd函数时,可以使用如下三种形式:

int gcd(int m,int n);//与函数头部书写完全一致,推荐初学者使用这种形式

【例5.1】 函数声明示例。

函数声明的语句既可以书写在某个函数体的内部,也可以书写在函数定义的外面。书写在特定函数内部时,用于向该函数声明被调用函数的特征,此时仅有书写了函数声明语句的函数知道被声明函数的存在。例如:例5.1使用的方法,就只有主函数知道函数gcd的特征,才能对gcd函数进行调用。当对被调函数的声明语句书写在函数定义的外面时,用于向该函数之后的所有函数声明被调函数的特征,即声明语句之后的所有函数都知道被调函数的特征,都可以对其进行调用。

当被调函数与主调函数位于同一源文件,且被调函数的定义出现在主调函数之前时,不必对被调函数进行声明,其原因是编译系统此时已经知道了被调函数的所有特征。

【例5.2】 对被调函数不必进行声明的示例。