函数是一段可以重复执行的代码。这个定义比较抽象,实际上就是我们常说的子程序。函数的来源有两大块,一是C语言为我们提供的大量函数,如 printf(),它们被声明在各种头文件、库文件中,使用前我们使用 #include 命令把相应的文件包含到我们的程序中就可以使用;另一块是我们自己编写 (自定义) 的函数,本文重点学习这一块内容。
我们要使用自定义的函数,前提是已经完成了这个函数的编写。我们编写函数的位置应在main()函数之前,也可以在 main() 函数前只完成函数的声明。函数内容可在其他地方实现。一个函数一般由返回值类型、函数名、参数和函数体构成。
1、返回值类型
所谓返回值类型就是运行完这个函数它返回一个什么类型的值,也可以看做是这个函数的类型。比如,具有整数加法功能的函数它的返回值类型是 int 型;具有浮点数加法功能的函数它的返回值是 float 类型。当然,有时运行一个函数只是让它完成一些操作,不需要返回什么,这种无返回值的函数我们也给它一个类型 void;也就是说函数前面不能空着,总得写上点什么。
返回值的之所以能够返回,需要有专门语句配合,凡有返回值的函数都有一条 return xxx; 语句将返回值返到函数外边。没有返回值的函数这条return语句可以省略,也可以只写一个return,表示无值可返。
2、函数名
函数名称的命名规则可以参照前文曾介绍的变量的命名规则,函数名后边加上一对括号"()"是函数的标配。也可以这样理解,有名字后边跟着括号无论括号是否空着我们都可以把它看成函数。( 特例是有参宏,不过看成函数也无所谓,根本上说有参宏也是重复使用的代码)
3、参数
函数要完成一些功能,有时需要外部传入一些值进去,这些值称为参数。参数写在函数名后边的括号中,参数前面需要写上参数是什么类型;这里的参数由于还没有确定的值,也不是确定的变量,所以也称为形参。参数可以是1个,也可以是多个,当然也可以没有。没有参数的函数括号内写上 void 或者干脆空着。
4、函数体
函数体是函数具体功能的实现部分,这部分内容要用一对大括号括起来,标志着函数结尾的最后一个 "}" 后边无需写 ";" ,写了也不报错。在前面的文章中曾提到语句块的概念,语句块也是用大括号括起来,这个不冲突。只有最外边的一对大括号括起来的内容加上自身才能成为函数体。函数体内可以有许多对大括号,各自完成各自的功能,但一定要成对出现。
举个例子:
cpp
int myPlus(int x1,int x2) //返回值类型int,函数名myPlus,参数x1 x2(参数的类型也要写上)
{
return x1+x2; //返回值语句;将x1+x2的和return到函数外边
}
再举个例子:
cpp
void myPrint(void) //无返回值,无参数,函数名myPrint
{
printf("%d",12+13); //仅显示12+13的和,不返回什么,省略了return
}
5、函数的声明
我们把前面举的两个例子,原样放到一个C语言程序 main() 函数前面(即源码文件的顶层),就完成了这两个函数的声明并同时完成了两个函数的实现(实现就是把函数体代码写好)。
也可以把函数的声明与函数的实现分开来写。比如:在main() 函数前面只写上"int myPlus(int x1,int x2);",如此就算完成了myPlus的声明;至于实现,可以放到程序的其它位置,靠前靠后都可以。但无论怎样,函数的声明与实现都不能写到其它函数的内部,包括不能写到main函数内部。
6、函数的调用
函数的调用就是使用一个函数完成一定的操作,再强调一下,使用一个函数必须保证这个函数已经声明并完成了实现。调用一个函数的位置没有要求,在哪都可以调用,在其它函数中或者main函数中都可调用。
调用有参函数时,传入参数的个数、类型要与原声明的参数一致,这里写参数时,参数一般是确定的值或者是已经声明并赋值的变量,所以这里就不需要写参数类型了,写了会报错。有返回值的函数可以先定义一个类型一致的变量来接收返回值,当然直接使用有返回值的函数对返回值不予接收也是可以的(有些C语言内置函数不接受返回值会报警,但不影响运行)。
一个函数只能有一个返回值。如果想返回多个值,可以返回一个数组的首地址指针,然后用指针按图索骥,找到其它值。或者在函数内部操作全局变量、指针都可以影响到函数外部,不一定必须从返回值得到结果。
函数调用的特例:递归调用,即函数中自己调用自己;这种调用方式内部必须有一个在特定条件下结束的机制,否则会陷入死循环。典型的递归调用程序是计算阶乘,关于计算阶乘的小程序本人曾经发表过,有兴趣可以在我的博文中找找。
再举一个完整的关于函数的例子:
cpp
float mySum(float a1,float a2,float a3) //返回值float三个参数也是float(参数与返回值类型可以不一致)
{
return a1 + a2 + a3; //返回三个参数的合计
}
#include<stdio.h>
int main(void)
{
float x=mySum(1.23,4.56,7.89); //调用mySum函数传入3个参数并用x接收返回值
printf("%f", x); //将x显示到屏幕
getchar(); //阻塞程序运行
return 0;
}