一、函数概述
1.1 函数的作用
- 函数的使用可以省去重复代码的编写,降低代码重复率
- 函数可以让程序更加模块化,从而有利于程序的阅读,修改完善
1.2 函数的调用:产生随机数
调用函数时,需要关心:
- 头文件:包含指定的头文件
- 函数名字:函数名字必须和头文件声明的名字一样
- 功能:需要知道此函数作用后才能调用
- 参数:参数类型要匹配
- 返回值:根据需要接受返回值
每次结果都一样,不够随机。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
a = rand();
printf("a=%d\n", a);
return 0;
}
优化后:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int a,tmp;
tmp = time(NULL);//获取系统当前时间
printf("tmp=%d\n", tmp);
srand(tmp);//设置系统时间为随机数种子
a = rand();//生成随机数
printf("a=%d\n", a);
return 0;
}
1.3 函数定义格式
一般形式:
返回数据类型 函数名(形式参数列表)
{
数据定义部分;
执行语句部分;
返回部分;
}
1.4 函数的组成
- 函数名:见名知意,后面()
- 形参列表:类型 变量名
- 函数体:函数功能代码块
- 返回值:return 变量;(变量类型需要和函数定义时的返回类型一致)
二、函数的执行
2.1 函数执行流程
- 程序开始会先执行main
- main函数中调用其他函数:先检查函数有没有定义;再检查函数原型;执行其他函数中的代码
- main函数会接收其他函数的返回值并向下运行
2.2 函数的形参和实参
- 函数定义时写在()中的是形参。
- 函数调用时传递的参数时实参。
2.3 无参函数和有参函数和有返回值函数调用
- 无参无返回值函数的定义和调用
#include<stdlib.h>
//函数的定义不能定义在函数的代码块里,必须在函数的外面定义函数
//符号加()代表这个是一个函数
//如果定义的函数没有形参,可以不填,也可以写void,但是返回值如果没有,需要写void
// 无参无返回值函数
//函数{}是函数体,所有的代码必须放在{}中
//函数结束之前需要返回值
//注意:返回值的类型看函数定义时,所需要的类型
void fun()
{
printf("hello fun\n");
printf("hello dfafa\n");
return;
}
int main()
{
printf("hello main\n");
//函数的调用 函数名+()
fun();
system("pause");
return 0;
}
- 有参无返回值的定义和调用
//定义一个有参无返回值函数
//函数定义时()里面的参数叫形参,(因为这个形参只是形式上的参数,定义函数时没有给形参开辟空间)
//形参只有在被调用时才会分配空间
//形参 的定义 类型名+变量名
void fun2(int a, int b)
{
int c = 0;
c = a + b;
printf("a+b=%d\n",c);
return;
}
int main()
{
printf("hello main\n");
//函数的调用 函数名+()
//fun();
//函数调用有参函数时,不可以不传参
//调用函数时.()里面的参数叫实参,
//实参的类型和形参的类型必须一致
//函数调用时,实参的个数应该和形参的个数相同
//实参为常量,可以为变量,可以为表达式,只要实参的类型和形参的类型匹配即可
int x = 10;
int y = 20;
//fun2(2,3)
fun2(x,y);
//fun2(x + y, x*y);
system("pause");
return 0;
}
- 有参有返回值
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//有参有返回值
int fun3(int a, int b)
{
int c = a + b;
return c;
//return a + b;
}
int main()
{
int x = 10;
int y = 20;
int sum = 0;
//调用有返回值函数时,可以不接返回值,也可以接
//注意 返回的类型和所接收返回值的变量的类型需要相同
//参数的传递,只能是单向传递(实参传给形参)
//sum = fun3(x, y);
printf("sum=%d\n",fun3(x,y));//将函数调用的返回值作为其他函数的参数
system("pause");
return 0;
}
2.4 函数的声明
- 声明的作用就是告诉编译器这个东西在其他地方定义
- 函数的声明,把函数的定义形式放在调用之前
- 没有函数体就是函数的声明,有函数体就是函数的定义
- 函数声明不用写函数体
- 声明函数时需要加分号
- 函数的声明不加extern 也是可以的
int main()
{
int x = 10;
int y = 20;
int sum = 0;
//注意 返回的类型和所接收返回值的变量的类型需要相同
//参数的传递,只能是单向传递(实参传给形参)
//sum = fun3(x, y);
//printf("sum=%d\n",fun3(x,y));//将函数调用的返回值作为其他函数的参数
void swap(int a, int b);
swap(x,y);
printf("x=%d y=%d\n",x,y);
system("pause");
return 0;
}
void swap(int a, int b)
{
int c = a;
a = b;
b = c;
printf("a=%d b=%d\n", a, b);
return;
}
2.5 return 和exit函数的区别
- return 结束当前所在的函数
如果return在子函数中调用只会结束子函数,如果return在main函数中,会结束整个程序
- exit 是一个库函数,用来结束整个程序
不管exit在哪里调用,都会结束整个程序