初学C语言day05--函数
函数:function
是一段具有某一项功能的代码集合,是C语言中管理代码的最小单位
把代码封装成一个个的函数,可以方便管理和调用代码
函数的分类:
标准库函数
C语言标准委员会为C语言以函数的形式提供的一些基础功能,被封装在了libc.so库中,使用具体功能时只需要添加对应的头文件,通过 函数名(实参) 即可使用
#include <stdio.h> <stdlib.h> <string.h>
#include <time.h>
time_t time(time_t *tloc);
功能:获取自1970-1-1 0:0:0 到调用时总共过了多少秒
time(NULL)
#include <stdlib.h>
int system(const char *command);
功能:在程序中调用系统命令
system("clear")
void srand(unsigned int seed);
功能:种随机种子
srand(time(NULL))
int rand(void);
功能:返回一个随机数
int num = rand()
获取10个[100,1000]之间的随机数
rand()%901 + 100
[a,b)
rand()%(b-a)+a
系统函数:
系统函数不是真正意义上的函数,是操作系统以函数形式提供的一些功能接口,提供以下功能:
内存管理、文件管理、文件IO、信号处理、进程管理、进程间通信、线程管理、线程同步、网络通信等
第三方库函数:
由第三方公司、个人提供的免费或收费的代码函数
GitHub\码云
MD5 加密算法
glog 日志管理
JSON 序列化和反序列化
自定义函数:
为了更好地管理代码、减少代码冗余把代码封装成自定义函数
函数声明:
告诉调用者、编译器该函数的调用格式
返回值类型 函数名(类型名1 形参名,类型名2 形参名,...);
注意:
1、一般C语言中函数名全部小写,可以用下划线分隔,最好见名知意
2、如果不需要参数,建议写void,不要空着,否则调用时容易产生歧义
3、如果没有返回值,一定要写void,否则编译器会处理为int类型
隐式声明:
如果在函数调用前没有任何的函数声明、定义,则会编译器会产生"隐式声明"的警告,并且编译器会自动猜测一个函数格式,返回值猜测为int类型,如果在后面刚好找到一个对应的函数,调用可以成功
不要让程序产生隐式声明,在调用前一定要有声明或定义
注意:
如果在函数调用前有函数定义,则函数声明可以省略
函数定义
返回值类型 函数名(类型名1 形参名,类型名2 形参名,...)
{
//函数体 函数具体功能的实现
return (val);
//1、返回val给调用者
//2、提前结束函数执行
}
函数调用:
函数名(实参);
注意:需要把函数的结果保存到变量或者输出,否则结果会消失
函数传参:
1、普通形参变量只属于它所在的函数,出了该函数就不能使用,也不会与其他函数同名的普通变量起冲突
2、实参与普通形参之间传参是以赋值的方式进行单向值传递
3、通过return语句,数据传递给调用者,本质上其实是把返回值数据放入一个公共区域(调用者和函数共享),调用者会去该区域获取返回值,如果不写return语句,调用者会在该区域获取到一个垃圾数据
4、当数组作为函数的参数时,长度会丢失,需要额外增加一个参数传递数组的长度
5、数组的传递是"址传递",函数与函数调用者可以共享数组
设计函数的准则:
1、一个函数最好只解决一个问题,可以降低出错概率、提高可读性
2、函数的数据由调用者提供、执行结果传递给调用者,提高函数的通用性
3、要考虑函数参数的非法数据,可以通过返回值返回非法值或者通过注释告诉调用者使用非法数据的结果,提高函数的健壮性
4、一个函数最好不要超过50行
函数递归:
函数自己调用自己的行为叫做递归,可能会出现死循环,最后可能会内存崩溃
递归是分治算法的具体实现,就是把一个大而复杂的问题,拆解成若干个相同的小问题并逐一解决,最终解决全部问题,循环也是一种实现
1、写出口(很重要)
2、解决一个小问题
3、改变参数、调用自己
递归函数每次调用自己都会在栈内存产生一份自己的拷贝,直到到达出口,才逐层返回,以此递归非常耗费内存,与循环相比速度非常慢,如果能用循环解决的问题就用循环
递归的优点:
1、可以解决非线性问题(二叉树的前中后序遍历)
2、好理解、思路清晰
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程