【回调函数】

1.回调函数是什么?

回调函数就是⼀个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另⼀个函数当这个指针被用来调用其所指向的函数
时,被调用的函数就是
回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发⽣时由另外的⼀方调用的,用于对该事件或条件进⾏响应。
只有调⽤函数的逻辑是有差异的,我们可以把调⽤的函数的地址以参数的形式传递过去,使⽤函数指针接收,函数指针指向什么函数就调⽤什么函数,这⾥其实使⽤的就是回调函数的功能。

接下来是一个简易计算器(利用回调函数)

#include <stdio.h>
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int mul(int a, int b)
{
    return a * b;
}
int div(int a, int b)
{
    return a / b;
}

void calc(int(*pf)(int, int))
{
    int x, y;
    int ret = 0;
    printf("输入操作数:");
    scanf("%d %d", &x, &y);
    ret = pf(x, y);
    printf("ret = %d\n", ret);
}

int main()
{
    int input = 1;
    do
    {
        printf("*************************\n");
        printf("  1:add           2:sub  \n");
        printf("  3:mul           4:div  \n");
        printf("********0. exit *********\n");
        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;
}

图 

下面是改造后的方法(利用数组函数进行优化,方便,减少冗余)

//加法
int add(int a, int b)
{
	return a + b;
}
//减法
int sub(int a, int b)
{
	return a - b;
}
//乘法
int mul(int a, int b)
{
	return a * b;
}
//除法
int div(int a, int b)
{
	return a / b;
}
//菜单
void menu()
{
	printf("*****************************\n");
	printf("********1.add   2.sub********\n");
	printf("********3.mul   4.div********\n");
	printf("********   0.exit  **********\n");
	printf("*****************************\n");
}
int main()
{
	int* (*pfArr[])(int, int) = {NULL,add ,sub,mul,div};//函数指针数组,存放函数
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do {
		menu();
		printf("请选择");
		scanf("%d", &input);
		if (input >= 1 && input <= 4) {
			printf("请输入两个操作数:");
			scanf("%d %d", &x, &y);
			ret = pfArr[input](x, y);//这里进行调用函数数组里面的函数
			printf("%d\n",ret);
		}
		else if(input==0){
			printf("退出\n");
		}
		else {
			printf("选择错误,重新选择");
		}
	} while (input);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/698362.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux的持续性学习

安装php 第一步&#xff1a;配置yum源 第二步&#xff1a;下载php。 yum install php php-gd php-fpm php-mysql -y 第三步&#xff1a;启动php。 systemctl start php-fpm 第四步&#xff1a;检查php是否启动 lsof -i :9000 计划任务 作用&am…

问题:下列关于信息的说法,错误的是( )。 #媒体#知识分享#学习方法

问题&#xff1a;下列关于信息的说法&#xff0c;错误的是&#xff08; &#xff09;。 A. 信息无时不在&#xff0c;无时不有 B. 信息随着时间的推移&#xff0c;效用会越来越小 C. 信息具有可处理性 D. 信息是同一时刻只能被单方使用 参考答案如图所示

pnpm : 无法加载文件 C:\Users\xxxxx\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。

vscode中执行pnpm install的时候&#xff0c;直接报了上面的错误。 解决&#xff1a; 然后输入&#xff1a;set-ExecutionPolicy RemoteSigned&#xff0c;按回车&#xff0c;然后根据提示&#xff0c;我们选A。 然后回车。 这样我们再次回到vscode中的我们就会发现可以了。 …

C++:SLT容器-->stack

C:SLT容器--&#xff1e;stack 1. stack容器2. stack 常用接口 1. stack容器 先进后出&#xff0c;后进先出不允许有遍历行为可以判断容器是否为空可以返回元素的个数 2. stack 常用接口 构造函数 stack<T> stk; // stack采用模板类实现&#xff0c;stack对象的默认构造形…

认识Spring 中的BeanPostProcessor

关于BeanPostProcessor和BeanFactoryPostProcessors&#xff0c;将分2篇文章来写&#xff0c;这篇文章是对Spring 中BeanPostProcessor进行了总结 先看下大模型对这个类的介绍&#xff0c;随后再看下这两个类的示例&#xff0c;最后看下这两个类的实现。 这两个类从名字看都很类…

三丰云免费服务器

云网址&#xff1a; https://www.sanfengyun.com 可申请免费云服务器&#xff0c;1核/1G内存/5M宽带/有公网IP/10G SSD硬盘/免备案。 收费云服务器&#xff0c;买2年送1年&#xff0c;有很多优惠

MAVEN架构项目管理工具(下)

1、maven工程约定目录结构 每一个maven在磁盘中都是一个文件夹&#xff08;即项目&#xff0c;以hello项目为例&#xff09; Hello/---/src------/main #放置主程序Java代码和配置文件-----------/java #程序的包和包中的文件-----------/resource #java程…

敏捷风险管理:识别和应对项目威胁与机会

项目风险是一种不确定的事件或条件&#xff0c;一旦发生&#xff0c;就会对项目目标造成积极或消极的影响。 现实中&#xff0c;风险可能是微妙而复杂的&#xff0c;缺少经验的人很难对其进行识别和管理。 敏捷风险管理是敏捷项目治理的基础。在敏捷环境下&#xff0c;敏捷风险…

Spring Boot 项目启动时在 prepareContext 阶段做了哪些事?

概览 如果你对Spring Boot 启动流程还不甚了解&#xff0c;可阅读《Spring Boot 启动流程详解》这篇文章。如果你已了解&#xff0c;那就让我们直接看看prepareContext() 源码。 private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironme…

Knife4j 全局鉴权需求 (在OpenAPI3规范中添加Authorization鉴权请求Header)

文章目录 引言I Knife4j 全局鉴权需求1.1 利用springdoc项目提供的customizer接口解决1.2 常见问题II 添加自定义Header参数(签名字段)see also引言 OpenAPI3规范对于Security的定义说明,主要分为两部分: 在compoents组件下定义Security的鉴权方案类型在接口级别的Operati…

工业机器人远程运维,增强智慧工厂运营管理

1、需求背景 随着工业自动化技术的普及和工业机器人应用的增加&#xff0c;制造业对于生产线稳定性和效率的要求不断提高。然而&#xff0c;传统的现场监控方式存在着地理位置限制、实时监控难度大以及诊断能力有限等问题&#xff0c;迫切需要一种更具灵活性和效率的监控方式。…

这可能是最清晰易懂的 G1 GC 资料

滑动验证页面 概述 G1 (Garbage-First) 于JDK 6u14版本发布&#xff0c;JDK 7u4版本发行时被正式推出&#xff0c;在JDK9时已经成了默认的垃圾回收器&#xff0c;算是CMS回收器的替代 方案&#xff08;CMS在JDK9以后已经废弃&#xff09; G1是一款分代的 (generational)&a…

AI漫画赛道,10分钟快速赚钱秘诀!

AI百宝箱-Chatgpt4.0、Midjourney绘画、人工智能绘画、AI换脸、AI图片放大、AI图片分析、AI图片融合https://h5.cxyhub.com/?invitationhmeEo7 先使用ChatGPT写小说 ComicAI 漫画小说生成网站 1. 创建小说漫画 2. 故事模板 3. 生成角色形…

基于spring boot+MySQL 小区物业管理系统-计算机毕设 附源码37236

spring boot 小区物业管理系统 摘 要 在网络信息的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;小区物业只能以客户为导向&#xff0c;以产品的持续创新作为小区物…

音视频集式分布式拉流管理

一直以来&#xff0c;由于srs zlm等开源软件采用传统直播协议&#xff0c;即使后面实现了webrtc转发&#xff0c;由于信令交互较弱&#xff0c;使得传统的安防监控方案需要在公网云平台上部署大型流媒体服务器&#xff0c;而且节点资源不能统一管理调度&#xff0c;缺乏灵活性和…

问题:小石明知道上课玩手机会影响学习,但就是管不住自己。这说明小石缺乏()教育。 #职场发展#职场发展#经验分享

问题&#xff1a;小石明知道上课玩手机会影响学习&#xff0c;但就是管不住自己。这说明小石缺乏&#xff08;&#xff09;教育。 A.道德情感 B.道德意志 C.道德行为 D.道德认识 参考答案如图所示

B-6 Web应用程序文件包含-Server2233(环境+解析)

B-6 Web应用程序文件包含 任务环境说明:服务器场景名称:Server2233(关闭链接) 通过扫

C++ | Leetcode C++题解之第143题重排链表

题目&#xff1a; 题解&#xff1a; class Solution { public:void reorderList(ListNode* head) {if (head nullptr) {return;}ListNode* mid middleNode(head);ListNode* l1 head;ListNode* l2 mid->next;mid->next nullptr;l2 reverseList(l2);mergeList(l1, l…

Apple WWDC24的18条总结:从GPT-4o开始集成ChatGPT

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之…

通过 CartPole 游戏详细说明 PPO 优化过程

CartPole 介绍 在一个光滑的轨道上有个推车&#xff0c;杆子垂直微置在推车上&#xff0c;随时有倒的风险。系统每次对推车施加向左或者向右的力&#xff0c;但我们的目标是让杆子保持直立。杆子保持直立的每个时间单位都会获得 1 的奖励。但是当杆子与垂直方向成 15 度以上的…