函数的定义和调用
无参无返回值
语法格式如下:
c
// 函数定义
void 函数名() {
函数体
}
// 函数调用
函数名();
- 函数名是标识符的一种,需要遵循规则
- 函数只需要定义一次,反复调用
- 只定义函数,不调用函数,函数永远不会被执行
案例需求:
编写一个函数,里面实现 2 个数字相加,并打印相加后的结果
示例代码:
c
#include <stdio.h>
// 函数定义
void my_add() {
// 实现 2 个数字相加,并打印相加后的结果
int res = 1 + 2;
printf("res = %d\n", res);
}
int main() {
// 函数调用
my_add();
return 0;
}
执行流程
有参无返回值
函数参数的作用:增加函数的灵活性
可以根据需求在调用函数时,通过参数传入不同的数据
语法格式如下:
c// 函数定义 void 函数名 (形参列表) { 函数体 } // 函数调用 函数名 (实参列表);
实参和形参的关系:从左往右,一一对应
案例需求:
编写一个函数,实现 2 个数相加,2 个数通过参数传递
示例代码:
c#include <stdio.h> // 函数定义 void my_add(int a, int b) { // 实现 2 个形参相加,并打印相加后的结果 int res = a + b; printf("%d + %d = %d\n", a, b, res); } int main() { // 函数调用 my_add(10, 20); return 0; }
执行流程
有参有返回值
返回值基本语法
函数返回值的作用:函数外部想使用函数内部的数据
语法格式如下:
c// 函数定义 返回类型 函数名 (形参列表) { 函数体 return 和返回类型一致的数据(或变量); } // 函数调用 和返回类型一致的变量 = 函数名 (实参列表);
return 是函数的专属关键字,只能用在函数内容
案例需求:
编写一个函数,实现 2 个数相加,2 个数通过参数传递,返回累加结果给外部使用
示例代码:
c#include <stdio.h> // 函数定义 int my_add(int a, int b) { // 实现 2 个形参相加,并返回累加的结果 int res = a + b; return res; } int main() { // 函数调用 int temp = my_add(10, 20); printf("temp = %d\n", temp); return 0; }
执行流程
返回值注意点
return 的作用是结束函数
函数内,return 后面的代码不会执行
示例代码
c#include <stdio.h> // 函数定义 void func() { printf("11111111111111111\n"); return; // 结束函数,函数内后面代码不会执行 printf("222222222222222222\n"); } int main() { // 函数调用 func(); return 0; }
函数的声明
- 如果函数定义代码没有放在函数调用的前面,这时候需要先做函数的声明
- 所谓函数声明,相当于告诉编译器,函数是有定义的,再别的地方定义,以便使编译能正常进行
- 注意:一个函数只能被定义一次,但可以声明多次
c
#include <stdio.h>
// 函数的声明,分号不能省略
// 函数声明的前面可以加 extern 关键字,也可以不加
// extern int my_add(int a, int b);
int my_add(int a, int b);
// 另一种方式,形参名可以不写
// int my_add(int, int );
int main() {
// 函数调用
int temp = my_add(10, 20);
printf("temp = %d\n", temp);
return 0;
}
// 函数定义
int my_add(int a, int b) {
// 实现 2 个形参相加,并返回累加的结果
int res = a + b;
return res;
}
函数案例
- 需求:自定义一个函数
my_max
,返回 2 个整数的最大值
c
#include <stdio.h>
// 函数定义
int my_max(int a, int b) {
if (a > b) {
return a;
} else {
return b;
}
}
int main() {
// 函数调用
int res = my_max(100, 200);
printf("res = %d\n", res);
return 0;
}