概述
- 函数是一种可重用的代码块,用于执行特定任务或完成特定功能
- 函数作用:对具备相同逻辑的代码进行封装,提高代码的编写效率,实现对代码的重用
- 函数作用演示代码:
#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; }
- 函数使用步骤
- 定义函数
- 理解为制作工具,工具只需要制作1次即可
- 调用函数
- 理解为使用工具
- 定义函数
- 函数分类
- 系统函数,即库函数:这是由编译系统提供的,用户不必自己定义这些函数,可以直接使用它们,如我们常用的打印函数printf()。
- 自定义函数:用以解决用户的专门需要。
1.函数的使用
无参无返回值
- 语法格式如下:
// 函数定义 void 函数名() {函数体 }// 函数调用 函数名();
-
函数名是标识符的一种,需要遵循规则
-
函数只需要定义一次,反复调用
-
只定义函数, 不调用函数, 函数永远不会被执行
-
- 案例需求:
- 编写一个函数,里面实现2个数字相加,并打印相加后的结果
- 示例代码:
#include <stdio.h>// 函数定义 void my_add() {// 实现2个数字相加,并打印相加后的结果int res = 1 + 2;printf("res = %d\n", res); }int main() {// 函数调用my_add();return 0; }
- 执行流程
有参无返回值
- 函数参数的作用:增加函数的灵活性。
- 可以根据需求在调用函数时, 通过参数传入不同的数据。
- 语法格式如下:
// 函数定义 void 函数名(形参列表) {函数体 }// 函数调用 函数名(实参列表);
- 实参和形参的关系:从左往右,一一对应。
- 案例需求:
- 编写一个函数,实现2个数相加,2个数通过参数传递。
- 示例代码:
#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; }
- 执行流程
有参有返回值
返回值基本语法
- 函数返回值的作用:函数外部想使用函数内部的数据
- 语法格式如下:
// 函数定义 返回类型 函数名(形参列表) {函数体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; }
- 执行流程
返回值注意点
- return的作用是结束函数
- 函数内,return后面的代码不会执行
- 示例代码
#include <stdio.h>// 函数定义 void func() {printf("11111111111111111\n");return; // 结束函数,函数内后面代码不会执行printf("222222222222222222\n"); }int main() {// 函数调用func();return 0; }
函数的声明
- 如果函数定义代码没有放在函数调用的前面,这时候需要先做函数的声明
- 所谓函数声明,相当于告诉编译器,函数是有定义的,再别的地方定义,以便使编译能正常进行
- 注意:一个函数只能被定义一次,但可以声明多次
#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;
}
函数案例
- 需求:自定义一个函数,返回2个整数的最大值
- 示例代码:
#include <stdio.h>// 函数定义 int my_max(int a, int b) {if (a > b) {return a;} else {return b;} }int main() {// 函数调用int res = my_max(100, 200);printf("res = %d\n", res);return 0; }
2.局部和全局变量
局部变量
- 定义在代码块{}里面的变量称为局部变量(Local Variable)
- 局部变量的作用域(作用范围)仅限于代码块{}, 离开该代码块{}是无效的
- 离开代码块{}后,局部变量自动释放
- 示例代码:
#include <stdio.h>// 函数定义 void my_add(int a, int b) {// a, b, res是局部变量,只能在my_add内部使用int res = a + b; }int main() {// 函数调用my_add(10, 20);// 函数外部无法使用函数内的局部变量,下面代码是错误的printf("%d, %d, %d\n", a, b, res);return 0; }
全局变量
- 在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件
- 示例代码:
#include <stdio.h>// 函数外定义的变量为全局变量,定义完,所有地方都能使用 int a = 10;int main() {// 使用全局变量printf("a = %d\n", a);return 0; }
多文件编程
- 把函数声明放在头文件xxx.h中,在主函数中包含相应头文件
- 在头文件对应的xxx.c中实现xxx.h声明的函数
防止头文件重复包含
- 当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件 include 多次,或者头文件嵌套包含。
- 为了避免同一个文件被include多次,C/C++中有两种方式。
- 方法一:
#ifndef __SOMEFILE_H__ #define __SOMEFILE_H__// 声明语句#endif
- 方法二:
#pragma once// 声明语句
命令行编译程序
gcc -g main.c func.c -o main.exe
- -g 指定编译的文件,多个文件用空格隔开。注意:只需要编译c文件,h文件不需要加入进去;
- -o 指定生成可执行文件的名字;
ps:命令行显示中文乱码,修改命令:chcp 65001
头文件包含的区别
- <> 表示系统直接按系统指定的目录检索
- "" 表示系统先在 "" 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索
extern关键字
extern主要用于声明外部变量或函数,当我们将一个变量或函数声明为extern时,那么就表示该变量或函数是在其他地方定义的,我们只是在当前文件中引用它。
示例
#include <stdio.h>extern int global_val;
extern void printf_val();int main() {global_val = 100;printf_val();return 0;
}
#include <stdio.h>int global_val;void printf_val() {printf("other->global_val: %d\n", global_val);
}