函数可以解决代码中【功能模块代码】大量重复使用,如果按照基本拷贝的方式处理当前功能使用,会导致以下问题:
- 代码冗余
- 代码阅读性极差
- 代码维护性极差
- 代码可移植性极差
函数学习要求:
- 熟练掌握必要的 C/C++ 系统相关函数,STM32 开发相关函数
- 自行封装功能函数
- 勇于通过文档使用未知函数的能力
int main(int argc, char *argv[])
{
// 函数体
}
/*
【返回值类型】int:
对应当前的返回值类型,要求当前函数在执行之后必须满足函数声明告知的返回值类型,对应的具体的数值。
【函数名】main:
函数名称,调用使用函数的必要名称。函数名具备一定的唯一性
1. 调用函数需要通过函数名
2. 函数名是一个【指针变量】
要求:
1. 满足命名规则
a. 小驼峰命名法
setStatus
b. 下划线命名法
set_status
2. 满足见名知意,动宾结构
【形式参数列表】(int argc, char *argv[]):
当前函数执行,所需的外来必要参数,小括号需要告知用户所需参数的数据类型、个数、顺序。
{ 函数体; }
封装的函数功能代码,考虑后期使用,增强功能的代码内容
综上所述,函数的基本格式:
返回值数据类型 函数名(形式参数列表)
{
函数体;
}
ReturnType FuntionName(PamaterTypes)
{
Funtion bady;
}
*/
函数的分类是根据返回值类型和形式参数列表情况进行分类
- 有参数有返回值类型【重点】
- 有参数无返回值类型
- 无参数有返回值类型
- 无参数无返回值类型
调用一个函数,通过函数得到两个整数之和,通过返回值告知用户
返回值数据类型★
两个整数相加得到的结果一定是整数,如果考虑到数据的范围变量和数据的变量安全,可以考虑使用long 类型作为当前函数的返回值类型,如果考虑到实际操作数据范围未超过 int 类型范围,依然可以使用 int 类型作为函数的返回值类型。
本次需求选择使用 int 类型作为函数的返回值类型。
函数名
【要求】见名知意,动宾结构,小驼峰/下划线命名法。
不要使用拼音,不要使用简拼,要求使用完整的英文单词组合。
get_num_of_two_int_number 或者 get_num
形式参数列表★
参数个数两个;
参数类型【整型】,对于整数数据类型考虑,大多数都是使用 int 类型;
当前函数所需的参数列表是两个 int 类型参数。
形式参数列表格式:
(int n1, int n2)
提供给形式参数列表的内容包括数据类型和对应形式参数列表的参数名称
int 是数据类型, n1, n2 是形式参数名称,可以直接在函数内部使用。作为函数体的变量,不同参数使用逗号隔开!!!
int get_num(int n1,int n2); // 告知编译器当前声明了一个函数,函数名为 get_num // 同时告知返回值类型为 int 类型,形式参数列表为(int, int)
在代码中,函数和函数同级关系,不存在函数内部存放其他函数
代码实现流程:
- 函数声明
- 函数实现
- 函数调用
#include
// 1. 函数声明,对于当前函数声明,完成对应的文档注释
/*
计算机用户提供的两个 int 类型数据之和,通过完成返回值告知用户
@param n1 用户提供的 int 类型数据
@prarm n2 用户提供的 int 类型数据
@return 用户提供的两个 int 类型数据相加之和
*/
int get_sum(int n1, int n2);
int main(int argc, char const *argv[])
{
int ret = 0;
printf("Before Funtion call, ret = %d\n", ret);
/*
函数调用规范要求
1. 必须有对应的函数名
2. 必须又小括号
提供当前函数的实际参数,严格按照形式参数列表声明的参数类型提供
当前 get_sum 函数所需参数是两个 int 类型数据,提供两个整数
使用 int 类型变量 ret 存储 get_sum 函数运行的返回值数据
*/
ret = get_sum(20, 40);
printf("After Funtion call, ret = %d\n", ret);
return 0;
}
// 2. 函数实现,完成函数体内容/功能模块代码,函数实现位置在 main 函数之后
int get_sum(int n1, int n2)
{
/*
当前函数有对应的函数返回值需求,需要使用一个关键字
return 关键字有两个作用:
1. 返回 return 之后的数据内容,要求数据类型满足返回值数据类型要求
2. 函数运行到 return 当前函数内容结束, return 关键字可以用于函数终止
*/
return n1 + n2;
}
在控制台展示用户提供的 int 类型数据
【重点】
在控制台不是函数的返回值,并且控制台展示对于项目研发没有什么用!!
返回值数据类型★
当前函数分析,没有对应的返回值类型,但是函数的返回值位置对于普通函数而言必须有对应的占位,使用 void 关键字在函数返回值位置,告知调用者,告知编译器,当前函数没有返回值类型 void。
函数名
【要求】见名知意,动宾结构,小驼峰/下划线命名法。
print_int_value
形式参数列表★
整个函数的需求实在控制台展示用户提供的 int 类型数据,用户提供的 int 类型数据就是函数的参数,当前参数有且只有一个,数据类型为 int 类型。
(int n);
int 表示数据类型,n 表示当前形式参数列表的参数变量名称。
void print_int_value(int n);
在代码中,函数和函数同级关系,不存在函数内部存放其他函数
代码实现流程:
- 函数声明
- 函数实现
- 函数调用
#include
// 1.函数声明
/*
在控制台打印展示用户提供的 int 类型数据
@param n 用户提供的 int 类型数据
*/
void print_int_value(int n);
int main(int argc, char const *argv[])
{
// 3. 函数调用,通过函数名和对应的实际参数调用目标函数
print_int_value(200);
return 0;
}
// 2.函数实现
void print_int_value(int n)
{
printf("用户提供的 int 类型数据为: %d\n", n);
}
调用函数,得到一个整数 5
返回值数据类型★
当前函数调用,获取一个整数 5,对应数据类型为 int 类型,所以当前函数的返回值数据类型为 int 类型
函数名
【要求】见名知意,动宾结构,小驼峰/下划线命名法。
give_me_five
形式参数列表★
当前函数不需要任何外来数据提供,就可以执行,没有参数,就是函数的固定格式中,必须有小括号存在。提供一个小括号,但是没有任何内容,表示没有参数。
()
int give_me_five();
在代码中,函数和函数同级关系,不存在函数内部存放其他函数
代码实现流程:
- 函数声明
- 函数实现
- 函数调用
#include
// 1. 函数声明
/*
当前函数调用返回一个整数 5
@return 返回值数据类型为 int 类型,返回整数常量 5
*/
int give_me_five();
int main(int argc, char const *argv[])
{
int ret = 0;
printf("Before Funtion call ret : %d\n", ret);
// 3. 函数调用
ret = give_me_five();
printf("After Funtion call ret : %d\n", ret);
return 0;
}
// 2. 函数实现
int give_me_five()
{
return 5;
}
直接在控制台上展示 元气满满的一天
返回值数据类型★
当前函数内容没有用任何返回值,使用 void 占位函数返回值
函数名
【要求】见名知意,动宾结构,小驼峰/下划线命名法。
have_fun_day
形式参数列表★
当前函数不需要任何外来数据提供,就可以执行,没有参数,仅使用小括号告知当前内容函数
()
void have_fun_day();
#include
// 1. 函数声明
/*
直接在控制台上展示 元气满满的一天
*/
void have_fun_day();
int main(int argc, char const *argv[])
{
// 3. 函数调用
have_fun_day();
return 0;
}
// 2. 函数实现
void have_fun_day()
{
printf("元气满满的一天!!\n");
}
号告知当前内容函数
()
void have_fun_day();
#include
// 1. 函数声明
/*
直接在控制台上展示 元气满满的一天
*/
void have_fun_day();
int main(int argc, char const *argv[])
{
// 3. 函数调用
have_fun_day();
return 0;
}
// 2. 函数实现
void have_fun_day()
{
printf("元气满满的一天!!\n");
}