目录
📝学前预警:
- 前面我们有学习C语言的一些基础知识,大家如果想学习可以打开专栏链接查看C语言专栏🔗
- 因为如果将所有的代码都放在
main函数中会将可读性降低,并且代码会很冗长- 如果我们可以将
main函数里面的部分代码分在其他函数中,再在main函数 / 其他函数中调用的话会让代码更加的清晰明了- 所以下面我们将学习函数的声明、定义、调用
- 声明:是为了告诉编译器有这个函数
- 定义:告诉编译器 "这个函数怎么做",函数的完整体现
- 调用:使用这个函数
❗️前言
- 在 C 语言中,函数 就是可重复使用的代码块。
- 有了函数,你就能让程序:
- 结构更清晰
- 代码更简洁
- 更容易调试与维护
比如下面的代码;
- 缺点:
- 一堆重复代码;
- 想改输出格式得改三次;
- 可读性差 、维护麻烦。
c
#include <stdio.h>
int main()
{
int a = 3, b = 5;
int c = a + b;
printf("和是:%d\n", c);
int x = 10, y = 20;
int z = x + y;
printf("和是:%d\n", z);
int p = 7, q = 8;
int r = p + q;
printf("和是:%d\n", r);
return 0;
}
- 那么我们是不是可以将这个重复的代码写一次 ,反复调用它就可以减少重复书写代码
- 函数的声明,定义,调用就可以完美的解决这个问题
💥函数声明、定义、调用
下面的代码是上面代码的优化
- 看上去下面的代码清晰明了
- 想改加法逻辑(比如改成乘法)只需要改一处
- 结构分明,逻辑层次更清楚
c
#include<stdio.h>
//函数声明
int add(int x, int y);
//主函数
int main()
{
int x, y;
for (int i = 0; i < 3; i++)
{
scanf("%d %d", &x, &y);
//函数调用
int a = add(x, y);
printf("%d+%d=%d\n", x,y,a);
}
return 0;
}
//函数定义
int add(int x, int y)
{
return x + y;
}
函数声明、定义、调用有什么用处呢?
| 名称 | 用法 | 意义 | 作用 |
|---|---|---|---|
| 声明(Declaration) | int add(int x, int y); |
告诉编译器这个函数的存在、名字add、参数(int x, int y)和返回值int |
让编译器在"定义之前"就能识别函数 |
| 定义(Definition) | int add(int x, int y) { return x + y; } |
告诉编译器函数怎么实现 | 真正实现功能的地方 |
| 调用(Call) | add(x, y); |
使用函数执行它的功能 | 让程序真正运行函数体里的代码 |
✅ 1. 声明:让编译器提前"知道"
- 当你在 main() 调用一个函数时,编译器必须知道它的"样子"(参数、返回类型)。
如果你在调用之前没定义,那就必须先声明,否则报错。✅ 2. 定义:实现功能
- 这是函数真正的"身体",代码逻辑都在这里写。
✅ 3. 调用:执行功能
- 调用就是实际运行函数代码、得到结果。
一个函数定义了但不调用,是不会执行的。
- 声明:告诉编译器"有这个函数"
- 定义:告诉编译器"这个函数怎么做"
- 调用:告诉程序"去做这件事!"
1️⃣函数声明的位置
| 声明位置 | 是否可行 | 有效范围 | 常见用途 |
|---|---|---|---|
| main 外 | ✅ 推荐 | 整个文件 | 多个函数都能使用 |
| main 内 | ✅ 允许 | 只在 main 函数内部有效 | 临时使用或局部函数声明 |
- 所以建议将函数声明放在main函数外面,最好是放在头文件下面。
2️⃣函数定义的位置对函数声明的影响
- 先定义再调用(不需要声明)
c
#include <stdio.h>
//函数定义(可以认为这样包含了函数声明)
int add(int a, int b)
{
return a + b;
}
//主函数
int main()
{
//函数调用
printf("%d\n", add(3, 5));
return 0;
}
- 先声明,再定义
c
#include <stdio.h>
// 函数声明
int add(int a, int b);
//主函数
int main()
{
//函数调用
printf("%d\n", add(3, 5));
return 0;
}
// 函数定义
int add(int a, int b)
{
return a + b;
}
3️⃣函数分类:有无"参数"和"返回值"
| 类型编号 | 参数 | 返回值 | 举例 | 特点 |
|---|---|---|---|---|
| ① | 无参数 | 无返回值 | void hello(); |
最简单,只执行某个操作 |
| ② | 有参数 | 无返回值 | void printSum(int a, int b); |
输入数据但不返回,只输出 |
| ③ | 无参数 | 有返回值 | int getRandom(); |
不需要输入,但返回结果 |
| ④ | 有参数 | 有返回值 | int add(int a, int b); |
最常见的形式,输入输出都要 |
3.1、无参数、无返回值函数
- 语法形式:
void 函数名();
特点
- 不接收任何输入;
- 不返回结果;
c
#include <stdio.h>
// 声明
void hello();
//主函数
int main()
{
// 调用
hello();
return 0;
}
// 定义
void hello()
{
printf("你好,C语言!\n");
}
3.2、有参数、无返回值函数
- 语法形式:
void 函数名(参数类型 参数名, ...);
特点
- 有"输入"(参数),
- 但没有返回值;
c
#include <stdio.h>
// 声明
void printSum(int a, int b);
int main()
{
printSum(3, 5); // 调用
return 0;
}
// 定义
void printSum(int a, int b)
{
printf("和是:%d\n", a + b);
}
3.3、无参数、有返回值函数
- 语法形式:
返回值类型 函数名();
特点
- 不需要传入任何参数;
- 自己内部计算结果并返回;
c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 声明
int getRandom(void);
int main()
{
srand((unsigned int)time(NULL));
printf("随机数:%d\n", getRandom()); // 调用
return 0;
}
// 定义
int getRandom()
{
int r=rand() % 100;
return r; // 返回一个0-99的随机数
}
3.4、有参数、有返回值函数(最常用)
- 语法形式:
返回值类型 函数名(参数类型 参数名, ...);
特点
- 有"输入"(参数)也有返回值;
- 是最通用、最灵活的函数类型;
c
#include <stdio.h>
// 声明
int add(int a, int b);
int main()
{
int result = add(10, 20); // 调用
printf("结果是:%d\n", result);
return 0;
}
// 定义
int add(int a, int b)
{
return a + b;
}
✒️小结:
- 上面我们学习了函数的声明、定义、调用
- 使用这个可以提高代码的可读性,代码会更清晰明了
感谢大家的阅读!🌹🌹🌹