首页 > 编程语言 >你真的了解回调函数吗?(文章最后放置源码)

你真的了解回调函数吗?(文章最后放置源码)

时间:2024-03-30 23:33:30浏览次数:30  
标签:case return 函数 int ret break 源码 放置 printf

一、什么是回调函数

简单来说就是通过函数指针调用的函数。

复杂一些呢就是说将函数的指针(地址)作为参数传递给另外一个函数使用,当这个指针被用来调用其指向的函数的时候被调用的函数就是回调函数。

二、回调函数怎么使用

1、在学习回调函数之前我们是如何进行运算的

我们来看下面这段代码:

按照我们之前所学习的知识来讲的话就是应该这样写,每次选择都有着自己的逻辑,但是同时我们也可以看到当前红色选框内的代码非常的繁琐,基本没有差别的代码多次出现,显得整个代码极其的臃肿不堪,那么有没有什么办法来解决呢?

是的有的,使用回调函数的方式就可以解决:我们可以把函数的指针作为参数来进行传递使用函数指针接收,函数指针指向什么,函数就调用什么,这样就实现了回调函数的功能。

2、学习回调函数之后的运算

我们来看修改后的代码:

此时我们使用了一个回调函数calc将其中相同的过程打包进去,极大的简化了代码。

(当前代码仍旧有很多可以改进的地方,比如switch中的参数case必须是数字吗?暂时还没有学到的同学可以了解一下枚举)

三、源码

以下就是本次学习中所遇到的所有代码了:

制作不易,求各位未来的大牛给点点赞吧

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//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;
//}
//
//void menu()
//{
//	printf("这是一个菜单。\n");
//}
//
//int main()
//{
//	menu();
//	int n = 1;
//	int a = 0;
//	int b = 0;
//	int ret = 0;
//	do
//	{
//		printf("请输入想要进行的操作:");
//		scanf("%d", &n);
//		switch (n)
//		{
//		case 1:
//			printf("请输入要计算的两个数(以空格分割):");
//			scanf("%d %d", &a, &b);
//			ret = Add(a, b);
//			printf("%d\n", ret);
//			break;
//		case 2:
//			printf("请输入要计算的两个数(以空格分割):");
//			scanf("%d %d", &a, &b);
//			ret = Sub(a, b);
//			printf("%d\n", ret);
//			break;
//		case 3:
//			printf("请输入要计算的两个数(以空格分割):");
//			scanf("%d %d", &a, &b);
//			ret = Mul(a, b);
//			printf("%d\n", ret);
//			break;
//		case 4:
//			printf("请输入要计算的两个数(以空格分割):");
//			scanf("%d %d", &a, &b);
//			ret = Div(a, b);
//			printf("%d\n", ret);
//			break;
//		case 0:
//			printf("计算器已退出!");
//			break;
//		default:
//			printf("输入不合法请重新输入:");
//		}
//	} while (n);
//	return 0;
//}


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;
}
void calc(int(*p)(int,int))
{
	int a = 0;
	int b = 0;
	printf("请输入要计算的两个数(以空格分割):");
	scanf("%d %d", &a, &b);
	int ret = p(a,b);
	printf("%d\n", ret);
}

void menu()
{
	printf("这是一个菜单。\n");
}

int main()
{
	menu();
	int n = 1;
	int a = 0;
	int b = 0;
	int ret = 0;
	do
	{
		printf("请输入想要进行的操作:");
		scanf("%d", &n);
		switch (n)
		{
		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");
		}
	} while (n);
	return 0;
}

标签:case,return,函数,int,ret,break,源码,放置,printf
From: https://blog.csdn.net/weixin_74202161/article/details/137169675

相关文章

  • 基于Android的校园二手交易平台系统应用设计与实现(论文+源码)
    安卓AndroidStudio校园二手交易平台app源码带javaweb后台Springbootmybatis框架数据库mysql,非常适合学习使用。包含项目报告,接近9000字数文档(项目介绍、需求分析、系统设计、关键技术实现、数据库表设计、主要模块关键代码、系统测试、成果展示);App基于AndroidStudio开......
  • 基于Android的IM即时通讯聊天系统应用设计与实现(论文+源码+讲解视频)
    安卓AndroidStudio聊天app源码带java后台Nettymybatis框架数据库mysql,非常适合学习使用。基于Netty实现IM即时通讯开发120分钟代码讲解视频包含项目报告,接近22000字数文档(绪论、项目相关技术、项目需求分析、项目系统设计、数据库设计、系统功能实现、系统测试、结论及参......
  • memcmp 函数的使用
    memcmp函数的使用memcmp函数的定义intmemcmp(constvoid*ptr1,constvoid*ptr2,size_tnum);⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节返回值如下:memcmp函数的使用#include<stdio.h>#include<string.h>intmain(){ charbu......
  • 用函数指针数组来实现对一系列函数的调用
    include<stdio.h>intadd(inta,intb);intsub(inta,intb);intmax(inta,intb);intmin(inta,intb);voidmain(){inta,b,i,k;int(*func[4])(int,int)={add,sub,max,min}//定义指针数组,并对其赋初始值printf("selectoperator(0-add,1-sub,2-max,3-min)......
  • 【即插即用】SE通道注意力机制(附源码)
    原文地址:Squeeze-and-ExcitationNetworks源码地址:GitHub-hujie-frank/SENet:Squeeze-and-ExcitationNetworks摘要简介:卷积神经网络建立在卷积操作的基础上,它通过融合局部感受野内的空间信息和通道信息来提取有用的特征。近年来,为了提高网络的表示能力,多种方法显示出......
  • 函数模板类型推断
    先看一段代码:template<typenameT>voidmyfunc(T&tmprv){cout<<"--------------------begin--------------------"<<endl;usingboost::typeindex::type_id_with_cvr;cout<<"T="type_id_with_cvr<T&......
  • 2024年3月全新超强版本itvboxfast影视APP源码 TV+手机双端源码 新增超多功能 tvbox二
    不要拿烂大街的版本比较,没有可比性,修复大街版本所有bug,增加超多功能。这个版本堪称如意界最强,后台支持某条线路、直播指定账号输入密码观看,VIP会员专用线路,去插播视频的广告,TV端修复套餐金额设置小数点闪退,更改公告显示样式,首页轮播图新增支持显示视频,TV端和手机端分别设......
  • 2023最新293TV v6.2 APP源码 神马TV影视APP源码可对接易支付 修复搜索附安装教程
    神马TV影视APP源码可对接易支付修复搜索附安装教程源码简介2023最新版本293TV、神马tv源码6.2版本修复首字母拼音搜索支持所有易支付解决6.2版本通病自动巡检删除后台文件JSON和api解析后台随意设置总共有5套后台:中控后台,会员后台,苹果CMS后台,反馈后台,解析后台,会员......
  • 高等数学基础篇之判断一元函数是否连续、可导、可微,极限、原函数是否存在
    一元函数:一、极限存在的条件二、连续的条件三、可导的条件四、可微的条件五、原函数存在的条件目录一、极限存在的条件1.自变量趋于无穷大时函数的极限2.自变量趋于有限值时函数的极限二、连续的条件1.自变量改变量趋于0时,函数值改变量也趋于02.该点的极限等于该......
  • Go 源码之 Chan
    Go源码之chango源码之chan-Jxy博客一、总结chan提供了一种在goroutine之间进行数据交换和同步的方式。通道可以用于控制并发访问和共享数据,从而减少竞态条件和死锁问题,并且可以自然地处理异步事件和信号。如果你的应用程序需要在goroutine之间传递数据或消息,那......