函数(function)是一段可重复使用的代码,用来完成一个明确任务。你已经使用过很多库函数(library function),例如 printf()、strlen()、sqrt()。现在我们开始学习如何定义自己的函数。
定义函数
函数定义使用 returnType functionName。函数可以接收输入,也可以返回输出。括号里的 num1 和 num2 是参数(parameter),调用函数时传进去的 4、12 这类具体值叫实参(argument)。
#include <stdio.h>
int larger(int num1, int num2) {
if (num1 > num2) {
return num1;
} else {
return num2;
}
}
int main(void) {
printf("%d\n", larger(4, 12));
printf("%d\n", larger(54, 33));
return 0;
}运行结果:
12
54return 的作用是把结果交回给调用者(caller)。函数执行到 return 后,本次函数调用就结束了。
知识测验
没有返回值的函数
有些函数只负责执行动作,不需要返回结果。例如打印一个简单棋盘:
#include <stdio.h>
void print_greeting(const char name[]) {
printf("Hello, %s!\n", name);
}
int main(void) {
print_greeting("Alice");
return 0;
}返回类型为 void 的函数不返回结果;函数执行到末尾后,控制权直接回到调用位置。
函数调用
函数调用(function call)发生时,程序会暂时离开当前位置,进入被调用函数的函数体(function body)内部执行。函数结束后,程序再回到原来的位置继续执行。这个“进入与返回”的过程可以用调用栈(call stack)理解。
调用者 → 函数 → 返回值
解锁完整互动实验、进阶解析与精选参考答案。
下面的程序把“两点间距离”的计算拆成 distance() 和辅助函数 square()。一个函数可以调用另一个函数,把复杂计算分解成清晰的小步骤。
#include <math.h>
#include <stdio.h>
double square(double value) {
return value * value;
}
double distance(double x1, double y1, double x2, double y2) {
return sqrt(square(x2 - x1) + square(y2 - y1));
}
int main(void) {
double x1, y1, x2, y2;
printf("请输入第一个点,例如 0, 0:");
scanf("%lf, %lf", &x1, &y1);
printf("请输入第二个点,例如 3, 4:");
scanf("%lf, %lf", &x2, &y2);
printf("距离:%.1f\n", distance(x1, y1, x2, y2));
return 0;
}一次可能的运行结果:
请输入第一个点,例如 0, 0:0, 0
请输入第二个点,例如 3, 4:3, 4
距离:5.0嵌套调用:distance() 两次请求 square()
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
main()
每个 C 程序都从 main() 开始执行。其他函数必须在调用前完成声明或定义。
int main(void) {
printf("程序开始\n");
return 0;
}写一个计算绝对差的函数
编写 absolute_difference(num1, num2),返回两个数差值的绝对值。
- 定义函数。
- 使用 if/else 返回非负差值。
- 至少打印两组调用结果。
写一个判断素数的函数
把素数判断封装进可复用的 is_prime(n)。
- n <= 1 时返回 false。
- 检查到 sqrt(n)。
- 在 main() 函数中读取并输出结果。
计算一年中的第几天
拆出 is_leap、days_in_month 和 day_of_year 三个函数。
- 实现闰年判断。
- 返回每个月天数。
- 让 day_of_year 和 main 调用辅助函数。