回调函数详解

发布时间:2023年12月17日

1.引入

??回调函数就是?个通过函数指针调?的函数。

? 如果你把函数的指针(地址)作为参数传递给另?个函数,当这个指针被?来调?其所指向的函数时,被调?的函数就是回调函数。回调函数不是由该函数的实现?直接调?,?是在特定的事件或条件发?时由另外的??调?的,?于对该事件或条件进?响应。
? 在我们写的计算机的实现的代码中,有些代码是重复出现的,其中虽然执?计算的逻辑是区别的,但是输?输出操作是冗余的,有没有办法,简化?些呢?

2.实例讲解

? 先让我们引入例子:

? 这是一个我们自制模拟计算器计算两个整数加减乘除的代码:

//使?回调函数改造前 
#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;
}
int main()
{
 int x, y;
 int input = 1;
 int ret = 0;
 do
 {
 printf("******************
 printf(" 1:add 
 printf(" 3:mul 
 printf("******************
 printf("请选择:");
 scanf("%d", &input);
 switch (input)
 {
 case 1:
 printf("输?操作数:");
 scanf("%d %d", &x, &y)
 ret = add(x, y);
 printf("ret = %d\n", r
 break;
 case 2:
 printf("输?操作数:");
 scanf("%d %d", &x, &y)
 ret = sub(x, y);
 printf("ret = %d\n", r
 break;
 case 3:
 printf("输?操作数:");
 scanf("%d %d", &x, &y)
 ret = mul(x, y);
 printf("ret = %d\n", r
 break;
 case 4:
 printf("输?操作数:");
 scanf("%d %d", &x, &y)
 ret = div(x, y);
 printf("ret = %d\n", r
 break;
 case 0:
 printf("退出程序\n");
 break;
 default:
 printf("选择错误\n");
 break;
 }
 } while (input);
 return 0; }

? 我们发现在每一个case的后面都有着一堆相似重复的代码,这些代码会增加计算机的负担,对此,我们可以通过回调函数来对代码进行优化。

//使?回到函数改造后 #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 ret = 0;
 int x, y;
 printf("输?操作数:");
 scanf("%d %d", &x, &y);
 ret = pf(x, y);
 printf("ret = %d\n", ret);
}
int main()
{
 int input = 1;
 do
 {
 printf("******************
 printf(" 1:add 
 printf(" 3:mul 
 printf("******************
 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;}

文章来源:https://blog.csdn.net/xdx2578/article/details/135039220
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。