大家好,很高兴又和大家见面了!在上一篇我们了解了函数的参数与函数的调用,今天咱们要开始继续学习函数后面的知识点了。
五、函数的嵌套调用与链式访问
在数学中我们学过的函数除了常见的函数:常、指、幂、对、三角、反三角等函数外还有复合函数——f(g(x)),在咱们的C语言中对函数的使用同样除了自定义单一的函数外,还能将函数组合起来使用,也就是相互调用,这种调用方式就是咱们现在要探讨的嵌套调用与链式访问。
嵌套调用
理解:我对嵌套调用的理解就是在函数体内调用其它的函数。这里可能不太好理解,下面我来举例说明:
//函数嵌套调用
//打印hello
void p()
{
printf("hello\n");
}
//完成三次打印
void three_p()
{
for (int i = 0; i < 3; i++)
{
p();//在函数three_p中嵌套了函数p来实现函数three_p;
}
}
int main()
{
three_p();
return 0;
}
我们看一下,现在函数能不能如我们所想的一样正常运行;
链式访问
理解:把一个函数的返回值作为另一个函数的参数。
链式访问与嵌套调用的区别就是,嵌套调用是在函数体内进行函数调用,而链式访问是在函数的参数内进行函数调用,下面我们通过一个例子来进一步理解:
//函数的链式访问
int sum(int x, int y)
{
int z = x + y;
return z;
}
int main()
{
int a = 1, b = 3;
printf("%d\n", a + b);
int c = sum(a, b);
printf("%d\n", c);
printf("%d\n", sum(a, b));
return 0;
}
这个代码中我们可以看到,我们在第一次打印中,printf的参数是式子a+b,第二次打印中printf的参数是局部变量c,第三次打印中printf的参数是自定义函数sum,接下来我们看看打印的值会不会有什么不同:
从打印结果我们可以总结一个函数的参数可以是式子、变量以及函数,当一个函数作为另一个函数的参数是,就可以说是另一个函数通过链式访问了这个函数。
在理解了嵌套调用和链式访问后,咱们来编写一个可以进行两数的四则运算的代码,将函数的参数、调用以及嵌套和链式访问都归纳在内:
//两数相加
int sum(int* a, int* b)//int——返回类型;sum——函数名;a,b——函数形参
{
if (*a < *b)//函数体——函数的实现;
{
int c = *a;
*a = *b;
*b = c;
}
int d = *a + *b;
return d;
}
//两数相减
int sub(int a, int b)
{
int c = a - b;
return c;
}
//两数相乘
int mul(int a,int b)
{
int c = sum(&a, &b) * sub(a, b);//函数的嵌套调用;
return c;
}
//两数相除
int division(int a, int b)
{
int c = sum(&a, &b) / sub(a, b);
return c;
}
int main()
{
int x, y;
scanf("%d%d", &x, &y);
int n = sum(&x, &y);//函数的实参传址调用;
printf("x+y=%d\n", n);
printf("x-y=%d\n", sub(x, y));//函数的链式访问
int z = mul(x, y);//函数的实参传值调用;
printf("(x+y)*(x-y)=%d\n", z);
printf("(x+y)/(x-y)=%d\n", division(x, y));
return 0;
}
下面我们来看一下结果:
这里解释一下为什么是这个结果,因为我们在sum函数中使用的是传址调用,在sum函数体内我们对x、y进行了比较,完成了x与y的交换,所以此时交换完x=3,y=1,这也就是为什么虽然我们输入的是1和3但是结果却都是正数。
六、函数的声明与定义
函数声明
定义:告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
特点:1.函数的声明一般出现在函数的使用之前。要满足先声明后使用。2.函数的声明一般要放在头文件中的。
函数定义
定义:函数的定义是指函数的具体实现,交代函数的功能实现。
下面我们把刚刚两数四则运算的例子通过函数声明和函数定义的形式再给各位演示一遍:
我们在函数的功能模块中进行函数的定义;
在我们自己创建的头文件中对函数进行声明,此时函数具体存不存在与声明是无关的;
我们要引用刚刚定义的函数时,只需要引用我们创建的具有函数声明的头文件,此时使用双引号来进行引用,引用完头文件,我们就能正常使用自己定义的函数了。
结语
咱们今天的内容到这里就结束了,希望这篇内容能够帮助大家更好的理解自定义函数以及函数的使用,接下来随着学习的深入,我会继续给大家分享我在学习过程中的感受,感谢大家的翻阅,咱们下一篇见。