回调函数详解
2023-12-16 23:48:29
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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!