在C语言中,函数就像一个个功能独立的“工具”,把复杂的程序拆分成多个小函数,既能让代码更清晰,又方便重复使用。今天我们就从最基础的函数概念讲起,一步步学会如何定义、调用函数,最后通过实战案例巩固所学知识。
一、函数是什么?为什么需要函数?
函数的本质
函数是一段实现特定功能的代码块,可以被多次调用。比如计算两个数的和、打印一行文字,这些重复使用的功能都适合写成函数。
举个生活例子
做蛋糕时,“搅拌面粉”“打发奶油”“烘烤”这三个步骤就像三个函数。每次做蛋糕不需要重新发明这些步骤,直接调用即可。编程也是如此:把常用功能写成函数,既能减少重复代码,又方便后续修改维护。
函数的优势
1. 代码复用:写一次函数,多处调用,避免重复劳动。
2. 模块化设计:把复杂程序拆分成小功能,逻辑更清晰。
3. 便于维护:单个函数出问题,只需修改这部分,不影响整体。
4. 多人协作:不同开发者可以负责不同函数,高效配合。
二、函数的基础用法
1. 函数的定义:怎么创建一个函数?
函数定义的格式如下:
返回值类型 函数名(参数列表)
{
// 函数体:实现功能的代码
return 结果; // 如果返回值类型不是void,必须有return
}
- 返回值类型:函数执行完返回的数据类型(如int、float),如果不返回任何值,用void。
- 函数名:遵循标识符规则(字母、数字、下划线,不能以数字开头),建议用小写+下划线(如get_max)。
- 参数列表:接收外部传入的数据,多个参数用逗号分隔(如int a, int b)。
- 函数体:用{}包裹的代码,实现具体功能。
- return语句:返回结果给调用者,遇到return函数会立即结束。
2. 函数的分类
按不同标准,函数可以分为几类:
- 按来源:
库函数:C语言自带的,如printf、scanf(需要#include <stdio.h>)。
自定义函数:自己写的函数,比如计算阶乘的函数。
- 按参数:
无参函数:不需要传入数据(如void show_menu())。
有参函数:需要传入数据(如int add(int a, int b))。
- 按返回值:
有返回值函数:返回具体结果(如int max(int a, int b))。
无返回值函数:只执行操作,用void声明(如void print_hello())。
三、函数的核心概念
1. 形参和实参
- 形参(形式参数):函数定义时写的参数,相当于“占位符”,用来接收数据。 例:int add(int x, int y)中的x和y就是形参。
- 实参(实际参数):调用函数时传入的具体数据,可以是常量、变量或表达式。 例:add(3, 5)中的3和5,add(a, b+c) 中的a和b+c。
注意:C语言中参数传递是“单向值传递”,形参的变化不会影响实参。
比如:
void change(int x)
{
x = 100; // 修改形参
}
int main()
{
int a = 10;
change(a);
printf("%d", a); // 输出10,实参a没变
return 0;
}
2. 函数的返回值
- 函数的返回值类型要和`return`语句后的表达式类型一致(或能自动转换)。 例:int get_sum(int a, int b) { return a + b; }(返回int类型)。
- 无返回值的函数用void声明,可省略return。 例:void print_hello() { printf("Hello"); }。
- 一个函数可以有多个return语句,但同一时间只有一个会执行。
例:
int is_even(int n)
{
if (n % 2 == 0)
{
return 1; // 偶数返回1
}
else
{
return 0; // 奇数返回0
}
}
3. 函数的声明
C语言要求“先定义,后使用”,如果函数定义在调用之后,需要先声明。
声明格式:函数头 + 分号(可省略形参名)。
例:
// 函数声明
int add(int, int); // 省略形参名
// 或 int add(int a, int b);
// 函数调用(在main中)
int main()
{
printf("%d", add(2, 3));
return 0;
}
// 函数定义(在调用之后)
int add(int a, int b)
{
return a + b;
}
四、函数调用的三种方式
1. 作为语句调用:适合无返回值的函数。
例:show_menu();
2. 作为表达式调用:有返回值的函数,可参与计算。
例:int sum = add(2, 3) + 5;
3. 作为参数调用:函数返回值作为另一个函数的参数。
例:printf("%d", add(2, 3));
五、实战案例
案例1:计算阶乘
需求:写一个函数,计算1~n的阶乘(n! = 1×2×…×n)。
#include <stdio.h>
// 计算阶乘的函数
unsigned long factorial(int n)
{
unsigned long result = 1;
for (int i = 1; i <= n; i++)
{
result *= i;
}
return result;
}
int main()
{
int num;
printf("请输入一个整数:");
scanf("%d", &num);
printf("%d的阶乘是%lu\n", num, factorial(num));
return 0;
}
案例2:求多个数的最大值
需求:写一个函数求两个数的最大值,复用它求四个数的最大值。
#include <stdio.h>
// 求两个数的最大值
int get_max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int a, b, c, d;
printf("请输入四个整数:");
scanf("%d%d%d%d", &a, &b, &c, &d);
// 复用get_max函数
int max = get_max(a, b); // 先求前两个的最大值
max = get_max(max, c); // 再和第三个比
max = get_max(max, d); // 再和第四个比
printf("最大值是%d\n", max);
return 0;
}
案例3:简易计算器
需求:用函数实现加、减、乘、除功能,通过菜单选择操作。
#include <stdio.h>
// 菜单函数
void show_menu()
{
printf("===== 计算器 =====\n");
printf("1. 加法\n");
printf("2. 减法\n");
printf("3. 乘法\n");
printf("4. 除法\n");
printf("0. 退出\n");
printf("==================\n");
}
// 加法
float add(float a, float b)
{
return a + b;
}
// 减法
float sub(float a, float b)
{
return a - b;
}
// 乘法
float mul(float a, float b)
{
return a * b;
}
// 除法(处理除数为0的情况)
float div(float a, float b)
{
if (b == 0)
{
printf("错误:除数不能为0!\n");
return 0;
}
return a / b;
}
int main()
{
int choice;
float x, y, result;
while (1)
{
show_menu();
printf("请选择操作:");
scanf("%d", &choice);
if (choice == 0)
{
printf("退出程序!\n");
break;
}
printf("请输入两个数:");
scanf("%f%f", &x, &y);
switch (choice)
{
case 1: result = add(x, y); break;
case 2: result = sub(x, y); break;
case 3: result = mul(x, y); break;
case 4: result = div(x, y); break;
default: printf("无效选择!\n"); continue;
}
printf("结果:%.2f\n", result);
}
return 0;
}
六、总结
函数是C语言的核心,掌握函数能让代码更简洁、高效。今天我们学习了:
- 函数的定义、分类和核心概念(形参、实参、返回值)。
- 函数的声明和三种调用方式。
- 通过三个实战案例巩固了函数的用法。
多练习是掌握函数的关键,试试课后作业:写一个函数判断素数,或实现字符串反转功能,相信你会越来越熟练!