1 函数概述
函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。函数是一种可重用的代码块,用于执行特定任务或完成特定功能。函数主要作用是对具备相同逻辑的代码进行封装,提高代码的编写效率,实现对代码的重用。例如,实现一段文件说明函数:
#include <stdio.h>
// 定义函数
void func() {
printf(" _ooOoo_ \n");
printf(" o8888888o \n");
printf(" 88 . 88 \n");
printf(" (| -_- |) \n");
printf(" O\\ = /O \n");
printf(" ____/`---'\\____ \n");
printf(" . ' \\| |// `. \n");
printf(" / \\||| : |||// \\ \n");
printf(" / _||||| -:- |||||- \\ \n");
printf(" | | \\\\\\ - /// | | \n");
printf(" | \\_| ''\\---/'' | | \n");
printf(" \\ .-\\__ `-` ___/-. / \n");
printf(" ___`. .' /--.--\\ `. . __ \n");
printf(" ."" '< `.___\\_<|>_/___.' >'"". \n");
printf(" | | : `- \\`.;`\\ _ /`;.`/ - ` : | | \n");
printf(" \\ \\ `-. \\_ __\\ /__ _/ .-` / / \n");
printf(" ======`-.____`-.___\\_____/___.-`____.-'====== \n");
printf(" `=---=' \n");
printf(" \n");
printf(" ............................................. \n");
printf(" 佛祖镇楼 BUG辟易 \n");
printf(" 佛曰: \n");
printf(" 写字楼里写字间,写字间里程序员; \n");
printf(" 程序人员写程序,又拿程序换酒钱。 \n");
printf(" 酒醒只在网上坐,酒醉还来网下眠; \n");
printf(" 酒醉酒醒日复日,网上网下年复年。 \n");
printf(" 但愿老死电脑间,不愿鞠躬老板前; \n");
printf(" 奔驰宝马贵者趣,公交自行程序员。 \n");
printf(" 别人笑我忒疯癫,我笑自己命太贱; \n");
printf(" 不见满街漂亮妹,哪个归得程序员?\n");
}
int main() {
// 函数调用
func();
func();
func();
return 0;
}
2 函数分类
从定义的角度来看(即函数是谁实现的),函数可以分为以下几类:
-
系统函数:也称为库函数,存放在函数库中的函数,具有明确的功能、入口调用参数和返回值,这些函数由编译器的厂商提供实现,方便程序员进行软件开发。常见的库函数有printf()(用于打印信息到屏幕上)、strcpy()(用于字符串的拷贝)和pow()(用于计算数的次方)等。
-
用户定义函数:为了满足用户的专门需要而编写的。用户可以自定义函数的名称、参数和返回值类型,并在函数体内实现特定的功能。这样,当需要在程序的多个地方执行相同的操作时,就可以调用这个函数,从而提高代码的可重用性和可维护性。
3 函数的定义
3.1 无参无返回值函数
无参数无返回值函数的语法格式:
// 函数定义
void 函数名()
{
函数体
}
// 函数调用
函数名();
注意:
-
函数名是标识符的一种,需要遵循规则
-
函数只需要定义一次,反复调用
-
只定义函数, 不调用函数, 函数永远不会被执行
需求:实现100以内的累加并输出结果
#include <stdio.h>
// 函数定义
void sum() {
// 实现100以内的累加并输出结果
int result = 0;
for (int index = 1; index <= 100; ++index)
{
result += index;
}
printf("result = %d\n", result);
}
int main()
{
// 函数调用
sum();
return 0;
}
3.2 有参无返回值函数
函数参数的作用是增加函数的灵活性,可以根据需求在调用函数时, 通过参数传入不同的数据。有参无返回值函数的语法格式:
// 函数定义
void 函数名(形参列表)
{
函数体
}
// 函数调用
函数名(实参列表);
注意,实参和形参的关系:从左往右,一一对应。
需求:实现任意两个数的相加,并输出相加之和。
#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;
}
本段代码执行主要流程:
3.3 有参有返回值函数
函数返回值的作用是函数外部想使用函数内部的数据,有参有返回值函数语法格式:
// 函数定义
返回类型 函数名(形参列表)
{
函数体
return 和返回类型一致的数据(或变量);
}
// 函数调用
和返回类型一致的变量 = 函数名(实参列表);
注意,return是函数的专属关键字,只能用在函数内容。
需求:编写一个函数,实现2个数相加,2个数通过参数传递,返回累加结果给外部使用
#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;
}
本段代码执行主要流程:
4 函数的声明
-
如果函数定义代码没有放在函数调用的前面,这时候需要先做函数的声明
-
所谓函数声明,相当于告诉编译器,函数是有定义的,再别的地方定义,以便使编译能正常进行
注意,一个函数只能被定义一次,但可以声明多次
#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;
}
5 总结
定义函数的时候,关于函数的参数和返回值是什么情况,完全取决于函数的功能。当编写函数的时候,一开始不要想着函数如何传参和函数的返回值应该是什么而是当在编写代码的途中,要使用某些值,但是当前函数中不存在,此时就需要进行传参,这时候考虑怎么传参就是合适的时机当函数编写完毕后,考虑是否要将某些结果返回给其他函数去使用,此时需要考虑返回值。
使用函数的好处包括:
-
定义一次,可以多次调用,减少代码的冗余度。
-
模块化更好,方便调试程序,而且阅读方便