前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C:回调函数的介绍-学习笔记

C:回调函数的介绍-学习笔记

作者头像
LonlyMay
发布2024-10-21 21:27:22
840
发布2024-10-21 21:27:22
举报
文章被收录于专栏:一位计算机小白的学习日记

前言:

本篇文章我们将继续指针相关知识:回调函数

希望大家在看完后能够有所收获!

回调函数

 定义与概念

回调函数是一个通过指针调用的函数。

如果把函数指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数,回调函数不是有该函数的实现方直接调用,而是在特定的时间或条件发生时有另外的一方调用的,用于对该事件或条件进行响应。

假设有一个函数 A,它接收另一个函数 B 作为参数。当函数 A 在执行过程中达到某个特定条件时,它就会调用函数 B。这里的函数 B 就是回调函数。

是不是有点难以理解?我们先举个简单的实例来解释一下概念。

在该代码中,我们将add函数地址当作参数传递给test函数,然后通过函数指针pf找到add函数完成运算,在这个过程中,add函数就是回调函数。

 典型例题

我们来使用回调函数简化编写计算器程序的代码

简化前:

代码语言:javascript
复制
void menu()
{
	printf("************************\n");
	printf("**** 1.add   2. sub ****\n");
	printf("**** 3.mul   4. div ****\n");
	printf("******   0.exit    ******\n");
	printf("************************\n");
}
int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}
#include <stdio.h>
int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入两个操作数:");
			scanf("%d %d", &x, &y);
			ret = Add(x, y);
			printf("%d\n", ret);
			break;
		case 2:
			printf("请输入两个操作数");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("%d\n", ret);
			break;
		case 3:
			printf("请输入两个操作数");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("%d\n", ret);
			break;
		case 4:
			printf("请输入两个操作数");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("%d\n", ret);
			break;
		case 0:
			printf("退出计算器\n");
			break;	
         default:
	      printf("选择错误,请重新选择\n");
	      break;
		}
	} while (input);
	return 0;
}

通过上面的代码,我们能够完成计算器的基本功能实现,但是我们可以看到有大量的重复代码,导致代码冗余,怎么解决呢?在不使用回调函数的情况下。

我们是否可以尝试将相同的代码提出来?

这样看起来似乎完成了简化代码的操作,我们来测试一下、

可以发现,就算我们选择错误,也会让我们先输入两个操作数,这样在逻辑上就出现了问题,所以这样将相同的代码提出来的方法不可行。

那这里我们应该做呢?如何使用回调函数呢?

简化后:

代码语言:javascript
复制
void menu()
{
	printf("************************\n");
	printf("**** 1.add   2. sub ****\n");
	printf("**** 3.mul   4. div ****\n");
	printf("******   0.exit    ******\n");
	printf("************************\n");
}
int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}
calc(int(*pf)(int, int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入两个操作数:");
	scanf("%d %d", &x, &y);
	ret = pf(x, y);
	printf("%d\n", ret);
}
#include <stdio.h>
int main()
{
	int input = 0;
	
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		
		switch (input)
		{
		case 1:		
			calc(Add);//将加法函数
			break;
		case 2:	
			calc(Sub);
			break;
		case 3:
			calc(Mul);
			break;
		case 4:
			calc(Div);
			
			break;
		case 0:
			printf("退出计算器\n");
			break;	
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
		
	} while (input);
	return 0;
}

在上面代码中的calc函数,具有通用功能,可以计算 + - * / 四种运算,它通过接收传递过来的函数地址,来找到对应的函数,比如说将Add函数地址传递给calc函数,然后calc函数再通过函数指针pf找到函数Add完成加法运算。

 回调函数的作用

1.回调函数能够提高代码的复用性

  • calc函数可以被不同的运算函数调用,实现了代码的复用。无论是什么运算,只要符合函数指针的类型要求,都可以作为回调函数传递给calc进行运算。
  • 例如,如果在其他地方也需要进行类似的运算操作,可以直接调用calc函数,并传入相应的回调函数,而不需要重复编写输入处理和结果输出的代码。

2.回调函数的使用可以使得整个工程中有清晰的代码结构

  • menu函数负责展示菜单和接收用户输入,switch 语句根据用户输入决定调用哪个运算函数作为回调。而calc函数则专注于执行具体的运算操作,它并不关心具体的运算是什么,只需要接收一个函数指针作为参数,然后调用这个函数指针指向的回调函数进行运算。
  • 这种分离使得代码结构更加清晰,各个部分的职责明确,易于理解和修改。

结语:

本篇文章主要讲了回调函数的一些基本概念和例题介绍,后面随着小编学习的深入,会不断更新该模块的更多知识。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 回调函数
    •  定义与概念
      •  典型例题
        •  回调函数的作用
        • 结语:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档