函数在定义完以后,如果不被调用时不会被执行到的;在程序中main函数是主函数,是会被自动调用,C程序有且只有一个main函数。
无参函数的调用
调用方法:
函数名();
或者
变量 = 函数名();
如:
int func(){
printf("hello\n");
return 0;
}
int main() {
// 调用一个无参函数
func();
// 函数是int类型,所以接收的变量的数据类型也为int
int a = func();
printf("%d",a);
return 0;
}
这里需要注意的是,如果我们采用定义变量的方式来调用函数,当函数有返回值时,我们定义的这个变量的类型必须和函数的返回值是一致的。
有参函数的调用
调用方法:
函数名(实参列表)
或者
变量 = 函数名(实参列表)
如:
int func(int b, int c){
printf("%d %d\n",b,c);
return 0;
}
int main() {
// 调用一个有参函数
func(1,2);
// 变量的类型和函数类型一致
int a = func(1,2);
printf("%d",a);
return 0;
}
这里需要注意的是在函数调用时的实参个数必须和形参个数一样,并且类型也必须一致。
函数的嵌套调用
函数的嵌套调用指的是,某个函数在另一个函数中被调用。
代码如下:
int b()
{
printf("b\n");
return 0;
}
int a()
{
printf("a\n");
b();
return 0;
}
int main()
{
a();
return 0;
}
他调用逻辑如下图::
首先函数从主函数main开始,在main函数中调用了a函数,此时我们进入a函数中,先输出a,然后调用b,需要注意的是a函数的调用还没有结束,此时再进入b函数,输出b,然后b函数运行return 0
语句,此时b函数的运行就结束了,然后回到a中执行return 0
语句,此时a函数就运行完毕了,最后再回到main函数中执行return 0
语句,到这个时候函数的嵌套调用就执行完毕了。
递归函数的调用
递归函数的作用是重复调用函数本身,直到满足条件,然后终止调用。最经典的例子就是斐波那契数列,代码如下:
// 定义函数
int f(int n){
if(n==1)
return 1;
return f(n-1)*n;
}
int main(){
int a = f(3);
printf("%d",a);
return 0;
}
此时当我们调用f(3)时,函数返回f(2)*3,函数没有结束,返回的f(2)继续调用,返回f(1)*2,此时进行条件判断,n==1,f(1) == 1,然后函数再一次返回f(2) == 2,f(3)==f(2)*3==6,将求得的值返回给变量a ,输出a值为6。
函数的声明
再上面我们都只涉及到了一个函数,如果面对多个函数时,我们该怎么去定义和调用呢?例如:
int a(){
// 此时语句报错
b();
return 0;
}
int b(){
printf("hello");
return 0;
}
再定义时我们如果不按照先后顺序进行定义的函数编译器直接就报错,如果再遇到很多的函数定义时,又出现嵌套调用,我们一个一个去查看定义函数的先后顺序,这样就非常的麻烦,此时我们可以使用函数的声明。他的语法格式如下:
函数类型 函数名(形参列表);
需要注意的是这里的函数的定义,必须与函数定义时的返回值类型、函数名、形参列表一致,形参列表可以不填写变量名字,只需要填写形参的类型即可。如:int func(int,float);
此时我们还是像上面一样定义就不会报错了:
int a();
// 声明函数的形参列表中不带有变量
int b(int);
int a(){
// 此时语句报错
b(3);
return 0;
}
int b(int a){
printf("hello %d",a);
return 0;
}
int main(){
a();
return 0;
}