本节书摘来自华章出版社《迷人的8051单片机》一书中的第3章,第3.3节,作者高显生,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.3 函数
将解决某一问题的算法汇集起来,组成一个相对独立的函数,在需要时就可以调用这个函数来处理相应的问题,可以说,C程序的全部工作都是由多个不同的函数来完成的。函数可以根据需要自行定义,这一类函数我们称其为自定义函数。另外,为了简化代码编写的难度,通常C编译器还会将一些相对固定的功能事先编写成函数,以库的形式存储起来,这一类函数称为库函数。
3.3.1 自定义函数
这一类函数是用户根据需要自行定义的函数,须先定义后使用。自定义函数的形式如下:
类型标识符 函数名(形式参数列表)
{
声明部分;
语句部分;
}
类型标识符用于指定函数的类型。函数的类型就是函数返回值的类型,即函数被调用后,执行函数体中的程序段所取得的并需要返回给主调函数的值。在很多情况下函数没有返回值,此时类型标识符由“void”取代;函数名通常由1~8个字符组成,给函数起名建议与函数的功能相联系,以便于阅读和记忆;形式参数列表用于指定函数的输入参数及类型,各参数间用“,”分隔。函数被调用时,主调函数将赋予这些形式参数以实际的值;花括号“{}”括起的部分是函数体,由声明部分和语句部分构成。声明部分是函数体内部所用到变量的类型说明或要调用的函数声明。以下我们用一个函数的实例来说明自定义函数的方法:
int max(int a,int b)
{
int temp;
if(a>b) temp=a;
else temp=b;
return temp;
}
上面的函数是一个比较a、b两数大小的函数,函数的类型是整型,即函数执行后,会反馈一个整型的数据给主调函数。函数的输入参数(形参)有两个,一个是a,另一个是b,它们也是整型数据。函数调用时,主调函数会给a和b两个形式参数赋予具体的值(如3和8),以比较这两个数的大小,这一过程也称为将实际参数赋予形式参数;在函数体部分,第一行是声明部分,声明了一个整型的变量temp,之后是语句部分,使用了if语句来比较两个数的大小,并将比较结果用return语句返回。
这里需要说明的是,对于无返回值的函数,可以将函数的类型定义为“空类型”,类型说明符为“void”。同样如果函数没有入口参数,形参列表可以空白或用“void”表示,如某一既无返回值又无入口参数的函数书写方法如下:
void t0_init(void)
{
…
}
除了自定义函数以外,每一个C编译器都会提供一些库函数,这些库函数无需用户定义,也不必在程序中进行类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。比如在本书后面章节里使用的延时函数,就是由GCC编译器提供的库函数,随着学习的不断深入,相信你对库函数会有更深入的理解。
3.3.2 函数的声明和调用
在一个C程序中,当自定义函数位于主调函数后面时就需要在程序的开始位置对自定义函数进行声明,以便将函数的名称、函数参数的个数和类型等信息通知编译器,从而在调用此函数时,编译器能正确识别该函数并检查调用是否合法。
1. 函数的声明
类型标识符 函数名(参数类型1 形参名1,参数类型2 形参名2, …,参数类型n 形参名n);
如前面介绍比较a、b两个数大小的函数声明方法为:int max(int a,int b);
2. 函数的调用
定义函数的目的就是为了使用它来完成某些功能,函数调用的一般形式为:函数名(实际参数列表);
调用前面介绍的比较a、b两个数大小的函数方法可以参考以下代码:z=max(3,8); //比较3、8两个数的大小,并将比较的结果赋值给z
此函数在调用时,用于比较3和8两个数的大小,并将比较的结果赋值给z。调用无返回值的函数的方法可以参考以下代码:delay(5); //延时5ms