函数:function 方法
一段具有某项功能的代码的集合,是C语言中管理代码的最小单位
把代码封装成一个个的函数,是为了方便管理和调用代码。
函数的分类:
标准库函数:
C语言标准委员会为C语言以函数形式提供的一些基础的功能,被封装在libc.so库中,使用时需要包含头文件,只需要 函数名(参数) 调用即可。
系统函数:(不是函数)
是操作系统以函数接口形式提供的一些功能,这些功能包括:
内存管理、信号处理、文件IO、文件管理、进程管理、进程通信、线程通信、线程同步、网络通信
第三方库函数:
glog 日志记录
md5 密码验证
JSON 序列化和反序列化
自定义函数:
为了更好的管理代码、减少冗余,把代码封装成函数形式
注意:一个函数尽量不超过50行,一个函数负责一个功能
函数声明:函数声明的目的是为了告诉其他的代码使用者函数的调用形式
返回值类型 函数名(类型1 变量1,类型2 变量2,…);
1、C语言中函数名一般全部小写,用下划线分隔(sum_int)
2、如果不需要参数建议写void,不要空着
3、如果不需要返回值,也写void
隐式声明:当调用函数时没有定义,就会产生隐式声明,编译器会猜测函数的格式,返回值会 猜测成int类型,参数列表会根据调用时提供的参数来猜测。
函数定义:
返回值类型 函数名(类型1 变量1,类型2 变量2,…);
{
函数体
return val;
}
注意:如果定义写在调用之前,函数声明可以省略。
函数调用:
函数名(实参);
返回值放在调用时的位置,可以立即使用,也可以用变量来记录下来
练习:获取10个范围是[100,1000]的随机数
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc,const char* argv[])
{
srand(time(NULL));
int n;
for(int i = 0;i < 10;i++)
{
n = rand() % 901 + 100;
printf("%d\n",n);
}
}
运算符优先级:
单目、算数、位、关系、逻辑、三目
函数传参:
- 形参变量属于它所在的函数,出了该函数就不能使用了
- 实参和形参直接都是以赋值的形式进行数据传递的(值传送)
- return 其实是把返回值数据放置到一个公共区域(函数和函数调用者),如果不写return语句,那么该区域中就是一个随机的垃圾数据。
- 如果数组作为函数的参数传递时,长度会丢失,需要额外增加一个变量把数组的长度也传递过去。
- 函数之间数组的传递是"址传递",函数和函数调用者可以共享数组
值传递:
普通变量单向值传递 函数之间不能共享同名局部变量
址传递:
数组长度会丢失,需要额外增加一个参数传递数组长度,此时该数组就被两个函数共享
返回值:return语句并不是把数据直接传递给调用者,而是把返回值放在一个他们都能访问的公共区域,如果函 数没有return语句,该位置的值就是一个随机的垃圾数据(上上次函数的返回值)
练习:双色球:
6红球:1-33 不重复
1篮球:1-16 不重复
srand(time(NULL));
char red[6] = {
},cnt = 0,i = 0;
while(cnt < 6)
{
int num = rand() % 33 + 1;
for(i = 0; i<cnt ;i++)
{
if(num == red[i])
{
break;
}
}
if(i == cnt)
{
red[cnt++] = num;
}
}
我的垃圾代码
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc,const char* argv[])
{
srand(time(NULL));
int arr[6] = {
};
arr[0] = rand() % 33 + 1;
int m = 1,cnt = 0;
while(cnt<6)
{
arr[m] = rand() % 33 + 1;
cnt++;
for(int i = 0;i < m;i++)
{
if(arr[m