C语言之回调函数(非常重要)附带回调函数版本实现整型的加减乘除四则运算

举报
念君思宁 发表于 2023/02/15 09:05:42 2023/02/15
【摘要】 C语言之回调函数(非常重要)附带回调函数版本实现整型的加减乘除四则运算

对于回调函数!想必大家的第一想法,想必就是函数吧!其实这个也是笔者的第一想法,毕竟之前没有见过回调函数,所以就不怎么知道细节!默认为直接调用函数,就是回调函数,但等学会了回调函数,其实就不是这样想了!!

下面请参考一下笔者的在百度百科中的搜索结果:显示回调函数的作用,及其使用方法!原文链接为::回调函数_百度百科回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C++、Python、ECMAScript等更现代的编程语言中还可以使用仿函数或匿名函数。回调函数的使用可以大大提升编程的效率,这使得它在现代编程中被非常多地使用。同时,有一些需求必须要使用回调函数来实现。最著名的回调函数调用有C/C++标准库stdlib.h/cstdlib中的快速排序函数qsort和二分查找函数bsearch中都会要求的一个与strcmp类似的参数,用于设置数据的比较方法。https://baike.baidu.com/item/%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0/7545973?fr=aladdin下面是笔者简短的引用内容:借此来说明回调函数的重要性!也希望看到此篇博客的读者能够认真欣赏!

回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C++、Python、ECMAScript等更现代的编程语言中还可以使用仿函数或匿名函数。

回调函数的使用可以大大提升编程的效率,这使得它在现代编程中被非常多地使用。同时,

有一些需求必须要使用回调函数来实现。

言归正传:下面请看笔者对于回调函数所下的简单定义:

回调函数就是一个通过函数指针调用的函数!如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这个是回调函数!回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时,由另外的一方调用的,用于对该事件或条件的相应!

其实笔者之前所写的关于计算器方面的博客,就可以改编为:回调函数方法实现计算器

对于原文档的参考代码为:

1.写一个计算器(C语言版本),可以求出:整数的加,减,乘,除四则运算_念君思宁的博客-CSDN博客

2.

编写程序简单实现计算器:加减乘除功能(函数指针数组的写法)_念君思宁的博客-CSDN博客_实现简单计算器加减乘除

 上面的两个链接是笔者之前的实现计算器的两种C语言写法!下面笔者将会用回调函数来写一下计算器,实现整型的加减乘除运算!

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

上述代码主要还是函数部分,这儿可以实现加减乘除,及菜单的实现!

2.  函数的调用部分(重要环节)参考代码为:精彩环节!!

void cacl(int (*p)(int, int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入2个操作数——》");
	scanf_s("%d %d", &x, &y);
	ret = p(x, y);
	printf("%d\n", ret);
}

上面的这个代码段就用了回调函数,不知道细心的读者能否看清楚!!

在该代码中:ret = p(x, y);  就实现函数的调用:包括:Add,Sub,Mul,Div 这四个函数!对于ret = p(x, y);  也可以改写为:ret = (*p)(x, y);  那个  * 能够省略!

看见上述代码,对于p的调用或许还会有些疑惑,请看笔者的mian函数里面的内容,看了以后,或许您将会有恍然大悟的感觉!

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:》");
		scanf_s("%d", &input);
		switch (input)
		{
		case 1:
			cacl(Add);
			break;
		case 2:
			cacl(Sub);
			break;
		case 3:
			cacl(Mul);
			break;
		case 4:
			cacl(Div);
			break;
		case 0:
			printf("退出计算器!\n");
			break;
		default :
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
	return 0;
}

对于main函数里面的内容,每一次进行输入input,都会在switch语句里面进行判断,决定进入哪一个函数里面,然后在调用该函数,实现对输入两个数字的加减乘除运算!

对于下面函数的调用部分:

           cacl(Add);
 
			cacl(Sub);
 
			cacl(Mul);
 
			cacl(Div);

函数名就是函数的地址,既然是地址就要放在指针里面,所以前面使用了:

void cacl(int (*p)(int, int))
ret = p(x, y);

因此总的代码为:

//简化一下代码
 
#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");
	printf("***** 1.add    2. sub  ****\n");
	printf("***** 3.mul    4. div  ****\n");
	printf("*****     0.exit       ****\n");
	printf("***************************\n");
}
 
void cacl(int (*p)(int, int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入2个操作数——》");
	scanf_s("%d %d", &x, &y);
	ret = p(x, y);
	printf("%d\n", ret);
}
 
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:》");
		scanf_s("%d", &input);
		switch (input)
		{
		case 1:
			cacl(Add);
			break;
		case 2:
			cacl(Sub);
			break;
		case 3:
			cacl(Mul);
			break;
		case 4:
			cacl(Div);
			break;
		case 0:
			printf("退出计算器!\n");
			break;
		default :
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
	return 0;
}

代码的运行结果为:

 

上面就是笔者索要介绍的回调函数部分!回调函数版本实现整型的加减乘除四则运算

希望读者仔细思考!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。