回调函数就是一个通过函数指针调用的函数!如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这个是回调函数!回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时,由另外的一方调用的,用于对该事件或条件的相应!
其实笔者之前所写的关于计算器方面的博客,就可以改编为:回调函数方法实现计算器
对于原文档的参考代码为:
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; }
代码的运行结果为:
上面就是笔者索要介绍的回调函数部分!回调函数版本实现整型的加减乘除四则运算
希望读者仔细思考!