回调函数
我们还是以计算器为例来解释回调函数的使用
int main() { int x, y; int input = 1; int ret = 0; do { printf("***********************\n"); printf("1:add 2:sub\n"); printf("3:mul 4:div\n"); printf("***********************\n"); printf("请选择 "); scanf("%d", &input); switch (input) { case 1: printf("请输入两个操作数\n"); scanf("%d %d", &x, &y); ret = add(x, y); printf("%d\n", ret); break; case 2: printf("请输入两个操作数\n"); scanf("%d %d", &x, &y); ret = sub(x, y); printf("%d\n", ret); break; case 3: printf("请输入两个操作数\n"); scanf("%d %d", &x, &y); ret = mul(x, y); printf("%d\n", ret); break; case 4: printf("请输入两个操作数\n"); scanf("%d %d", &x, &y); ret = div(x, y); printf("%d\n", ret); break; default: printf("输入错误\n"); break; } } while (input); return 0; }
我们可以发现 case1 2 3 4里面有大量冗余的代码
那么我们可不可以通过一定的手段解决这个问题呢?
答案是可以 就是使用回调函数
定义
回调函数就是一个被作为参数传递的函数。
我们来设计一个case_()函数 并且将add div这些函数作为参数传递进去
要求: 可以实现和原函数一样的功能 代码不能冗余
void calc(int(*p)(int x, int y)) { int x = 0; int y = 0; int ret = 0; printf("请输入两个操作数\n"); scanf("%d %d", &x, &y); ret = p(x, y); printf("%d\n", ret); }
这就是上面思想指导写出来的代码
完整代码如下
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 x = 0; int y = 0; int ret = 0; printf("请输入两个操作数\n"); scanf("%d %d", &x, &y); ret = p(x, y); printf("%d\n", ret); } int main() { int x, y; int input = 1; int ret = 0; do { printf("***********************\n"); printf("1:add 2:sub\n"); printf("3:mul 4:div\n"); printf("***********************\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; default: printf("输入错误\n"); break; } } while (input); return 0; }
让我们试试它的运行结果
可以完美运行的
本来是向给大家分上下两期讲完指针进阶的 但是好像上一期写的太多内容了 这一期只有一个回调函数可以写
还有大量的指针题目我想放到配套作业专栏里去
那这一期就先这样啦
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯