函数声明
前面我们说,要使用一个函数必须经过两个步骤,声明函数和定义函数,现在我们来讲讲函数的声明。
1 |
|
上面我们声明了一个函数,函数的名字叫做 max ,返回值类型为 int ,含有两个参数,两个参数的类型都是 int 型。将这些信息告诉编译器之后,编译器就能知道 max 的作用了。
注意
函数声明需要在主调函数内进行,但是如果已经在之前(主调函数前)声明的函数,第二次调用时,不用再次声明。
总之,原则就是,先定义再使用,如果后定义,那就先声明再使用。声明之后,声明位置之后的函数再次调用,不必再次声明。
调用函数的三要素
如果一个函数要调用另一个函数,即一个函数能被调用的三要素是:
- 被调用的函数一定是已经
定义过
的函数,可以是自定义函数也可以是库函数。 - 使用库函数的时候,要使用
#include
指令将调用函数库的有关信息包含到本文件中来。例如#include <math.h>
这就是将数学函数库引入到了源程序中,math.h
文件包含了对数学函数的声明。 - 使用用户
自定义函数
时,而该函数的位置在主调函数的后面
时(就是同一个文件,自定义函数写在了主调函数后面),应该在主调函数中对被调用的函数进行声明
。
举个例子
我们设计一个简单的加法计算器,然后看看自定义函数的调用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(){
float plus (float a, float b);
float x, y;
printf("请输入需要相加的两个数:\n");
scanf("%f %f",&x,&y);
printf("%f+%f的结果是%f\n",x,y,plus(x,y));
return 0;
}
float plus(float a, float b){
float z;
z=a+b;
return (z);
}
我们看到 plus 函数在 main 函数下面,所以我们在 main 函数中要声明 plus 函数,否则在第 7 行的时候,编译器会疯掉,因为不知道从哪蹦出来个 plus 函数,里面还有俩参数,如果我们提前声明,那么编译器就知道通过 plus 函数名去后面找对应的函数了。
下面我们定义了 plus 函数,第一行我们称作函数的首行
,如果吧首行加上一个分号
,就变成了函数的声明
,我们把函数的首行(函数的首部)称为函数原型 (function prototype)
。
为什么用首行作为函数声明呢?
这是为了在声明时,编译器就可以检查函数类型、函数名、参数、参数类型等信息是否有错。实参和形参的类型是否一直,不一致按照形参进行转换。
函数定义和声明的区别
函数定义和声明不是一回事
,函数定义
主要是其功能性的确立
,是由函数类型、函数名、参数类型、参数名、函数体共同组成的一个函数整体。但是函数声明
主要是把函数的有关信息通知编译系统
。
函数的嵌套
前面我们说过,在 C 语言中函数定义是平行的、独立的
,也就是说,在一个函数内,不能定义另一个函数
,main 函数也是如此。所以函数只能相互调用,不能相互定义。
举个例子
利用函数嵌套,来判断输入的 4 个数中最大的。
1 |
|
我们先看一下调用顺序是:
main 函数调用 $\rightarrow$ max4 函数3次调用 $\rightarrow$ max2 函数
声明顺序:
因为 main 函数用到 max4函数,所以要声明,main 没有调用 max2 函数,所以不用声明。
max4 函数用到了 max2 函数,所以要声明。
函数嵌套的注意事项
从上面的例子我们不难看出,函数之间可以相互调用,如果在主调函数需要调用自定义函数时,一定要遵循先声明再使用的原则,如果主调函数用不到该函数,则不必声明,之前已经声明的函数,之后使用就不必声明了。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。