函数
- ==1.什么是函数==
- ==2.函数的分类==
- 1.库函数
- 2.自定义函数
- ==3.函数的参数==
- 1.实际参数(实参)
- 2.形式参数(形参)
- ==4.函数的声明==
- 1.同一个文件的函数声明
- 2.多文件的函数声明
- ==5.函数的调用==
- ==6.函数的嵌套调用和链式访问==
- 1.嵌套调用
- 2.链式访问
- ==7.函数递归==
1.什么是函数
函数也称为
子程序
,在计算机科学中,子程序是一个大型程序中的某部分代码,由一个或多个语句块组成
。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏
。这些代码通常被集成为软 件库。
2.函数的分类
1.库函数
库函数就是
C语言本身给我们已经定义好的函数
,作为程序员我们可以直接使用,就像printf()和scanf()。
注意:使用库函数必须包含头文件
,例如我们使用printf()与scanf()时要引用stdio.h头文件,即我们通常写的#include<stdio.h>
常见的库函数有IO函数,字符串操作函数,字符操作函数,内存操作函数,时间/日期函数,数学函数,其他库函数,后期用到的时候具体讲解。
2.自定义函数
自定义函数就是
程序员自己定义
用于实现特定功能
的函数!这给程序员一个很大的发挥空间。
格式:
return_type function_name( parameter list )
{
body of the function
}
- 返回类型:
一个函数可以返回一个值
。return_type 是函数返回的值的数据类型
。有些函数执行所需的操作而不返回值
,在这种情况下,return_type 是关键字void
。 - 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
- 参数:参数就像是占位符。当函数被调用时,
您向参数传递一个值
,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。 - 函数主体:函数主体包含一组定义函数执行任务的语句。
根据有无返回值可将函数分为有返回值函数,无返回值函数
有返回值的函数就返回一个值,而无返回值的函数就执行某些操作
根据有无参数可将函数分为有参函数,无参函数
例如:无参有返回值的函数
有参有返回值的函数
3.函数的参数
1.实际参数(实参)
真实传给函数的参数
,叫实参。 实参可以是:常量、变量、表达式、函数
等。
2.形式参数(形参)
形式参数是指
函数名后括号中的变量
,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁
了。因此形式参数只在函数中有效。
4.函数的声明
1.同一个文件的函数声明
一般如果把自定义函数写在了主函数后,一般要进行声明。函数声明会告诉编译器函数名称及如何调用函数
格式:
return_type function_name( parameter list );
上面的add函数声明为:
写在主函数main()的上面
。
int add(int a,int b);
正确示例:
2.多文件的函数声明
我们在设计多文件程序的时候,一般在以
.h为结尾的头文件内放置函数的声明
,在.c源文件内放置函数的定义
。
math.h的内容
放置函数的声明
#ifndef __MATH_H__ #define __MATH_H__ int max(int x, int y); int min(int x, int y); #endif
math.c的内容
放置函数的实现
#include "math.h" int max(int x, int y) { return x > y ? x : y; } int min(int x, int y) { return x < y ? x : y; }
主函数为
#include<stdio.h> #include"math.c" int main() { int a = 10; int b = 20; printf("max=%d\n", max(a, b)); printf("min=%d\n", min(a, b)); }
5.函数的调用
创建 C 函数时,会定义函数做什么,然后
通过调用函数来完成已定义的任务
。
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。例如:
6.函数的嵌套调用和链式访问
1.嵌套调用
特别注意:C语言中,函数可以嵌套调用,但是不能嵌套定义
2.链式访问
通俗来讲,链式访问就是把
一个函数的返回值作为另外一个函数的参数
。
貌似与嵌套调用挺像的,但两者是存在区别的:嵌套调用是在函数中调用函数,而链式访问则是将一个函数的返回值作为另一个函数的参数。
#include <stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
//结果是啥?
//注:printf函数的返回值是打印在屏幕上字符的个数
return 0;
}
打印结果是什么呢?最后的打印结果是4321,为什么呢?此处给大家普及一个知识点,printf()函数的返回值是正确输出在屏幕上的字符数,例如,输出在屏幕上的数字是43,此时函数的返回值就是2,如果打印在屏幕上的数字是2的话,返回值就是1,那么此处输出的结果也就不难理解了。
另外一个给大家补充的点是:在上面这个函数中,究竟是如何进行执行的呢?首先执行的是最外层的printf()函数
,而最外层函数的返回值依赖于次外层函数的返回值,而次外层函数的返回值又依赖于内层函数的返回值,就是层层向内调用
,然后层层返回
。printf(“%d”,43)的返回值是2,而printf(“%d”,2)的返回值是1,所以最终输出在屏幕上的就是4321,因为最内层函数先执行进行输出的,所以也可以理解成是由内向外进行执行的,但调用的顺序却是由外向内的。
7.函数递归
程序调用自身
的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的条件
(1)存在限制条件,当满足这个限制条件的时候,递归便不再继续。
(2)每次递归调用之后越来越接近这个限制条件。
int factorial(int n)
{
if (n <= 1)
return 1;
else
return n * factorial(n - 1);
}