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

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

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


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


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


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;
}

代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


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


希望读者仔细思考!


相关文章
|
24天前
|
安全 搜索推荐 Unix
【C语言】《回调函数》详细解析
回调函数是指一个通过函数指针调用的函数。它允许将一个函数作为参数传递给另一个函数,并在特定事件发生时执行。这种技术使得编程更加灵活,可以动态决定在何时调用哪个函数。
39 1
|
7月前
|
C语言
c语言表达式求值--整型提升
c语言表达式求值--整型提升
|
2月前
|
存储 C语言
C语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
|
3月前
|
存储 C语言
【C语言基础考研向】04整型进制转换
本文介绍了计算机中整型常量的不同进制表示,包括二进制、八进制、十六进制和十进制,并解释了它们之间的转换方法。以一个32位整型数为例,展示了其在不同进制下的表示形式及计算方法,特别指出在内存观察中常用十六进制,同时提到了小端存储方式对数据的影响。
|
7月前
|
编译器 C语言
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(下)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
54 0
|
5月前
|
前端开发 C语言
C语言04---第一个HelloWorld(vc版本)
C语言04---第一个HelloWorld(vc版本)
|
6月前
|
SQL 数据库 C语言
【sqlite的C语言访问接口】执行SQL语句的接口------sqlite3_exec回调函数的使用
【sqlite的C语言访问接口】执行SQL语句的接口------sqlite3_exec回调函数的使用
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的C语言在线评测系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的C语言在线评测系统附带文章源码部署视频讲解等
54 0
|
6月前
|
存储 编译器 C语言
C语言学习记录——数据的存储(数据类型、类型的基本归类、整型在内存中的存储、大小端介绍、浮点型在内存中的存储)一
C语言学习记录——数据的存储(数据类型、类型的基本归类、整型在内存中的存储、大小端介绍、浮点型在内存中的存储)一
72 2
|
6月前
|
存储 C语言
C语言整型详解
C语言整型详解