简单点,switch-case的结构简单点~ C语言学习(4)
来源:互联网 发布:西门子编程线 编辑:程序博客网 时间:2024/06/06 05:16
前言
最近将进程看完了,但是感觉自己理解的还不是很全面,线程看不进去,就无聊看了后面的信号,看到了里面要用函数指针,自己对它一直是一知半解,翻看《C和指针》,想到了一些很有趣的东西。简化繁复的switch-case结构。
函数指针
C程序在调用函数时,都有一个函数入口,怎么找到这个入口呢,通过指针,每个函数名在被使用时都是由编译器转化为函数指针,从而找到函数的位置。
switch-case的麻烦
书上举了一个例子,一个使用switch-case结构的计算器的程序
#include<stdio.h>double add(double a, double b){ return a+b; }double sub(double a,double b){ return a-b;}double mul(double a, double b){ return a*b; }double my_div(double a, double b){ return a/b;}int main(void){ double a,b,result; char opera; scanf("%lf%c%lf",&a,&opera,&b); switch(opera) { case '+': result = add(a,b); break; case '-': result = sub(a,b); break; case '*': result = mul(a,b); break; case '/': result = my_div(a,b); break; } printf("%lf %c %lf = %lf\n",a,opera,b,result); return 0;}
执行四种运算就要有4个case,然而实际程序要实现的功能往往很多,有没有更简洁的形式呢?
书上使用了转换表,通过函数指针数组实现
//函数指针数组初始化double (*oper_fun[])(double a, double b) = {add, sub, mul, my_div};//从键盘读入要运算的a,b只后直接计算结果result = oper_fun[i](a,b);
问题在于通过数组元素,即函数与下标是一一对应的,比如上边+就对应0,减就对应1,如何建立这样的映射呢?
我的解决方法是通过一个字符串常量来实现。这个常量与之前的指针数组是相同的,完整代码如下
#include<stdio.h>#include<string.h>double add(double a, double b){ return a+b; }double sub(double a,double b){ return a-b;}double mul(double a, double b){ return a*b; }double my_div(double a, double b){ return a/b;}double (*oper_fun[])(double a, double b) = {add, sub, mul, my_div};int main(void){ double a,b,result; char opera; int i; scanf("%lf%c%lf",&a,&opera,&b); /* 使用一个与指针数组一一对应的字符串常量,遍历字符串,找到调用函数的下标*/ for(i = 0; "+-*/"[i] != opera && i < strlen("+-*/"); i++); if(i == strlen("+-*/")){ printf("error\n"); return 0; } result = oper_fun[i](a,b); printf("%lf %c %lf = %lf\n",a,opera,b,result); return 0;}
不足
函数指针数组中的所指向的函数类型要相同,返回值与形参都要相同,所以对执行的函数要做到结构同一。
0 0
- 简单点,switch-case的结构简单点~ C语言学习(4)
- IDA简单Switch-Case结构的汇编代码分析
- C语言基础 switch case结构
- 毁人的switch-case,注意点
- C语言实现简单24点游戏
- switch结构注意点
- switch-case 语句的优点和几点注意事项 Java
- switch-case 语句的优点和几点注意事项 Java
- Java switch-case 语句的优点和几点注意事项
- 多SWITCH-CASE结构时的C语言对象方式化解
- c语言之路--简单的语言格式和注意几点及作业1
- 想的简单点
- hdu1028 简单点的
- 【简单】优雅的点
- printf函数,能不能简单点?----小话c语言(2)
- C语言中switch case语句的实现(switch case 和 else if 的比较、区别)
- 简单图形编程的学习(2)---点 (Qt实现)
- 【C语言】switch..case语句
- hdu 1689 Just a Hook
- 如何旋转recovery界面:恢复出厂设置界面和Fota升级界面
- 【数据结构与算法】汉诺塔递归
- Linux中的信号(2)
- Protobuf解析失败,_extensions_ 中的数据 却成了 _unknown_fields
- 简单点,switch-case的结构简单点~ C语言学习(4)
- 约瑟夫问题
- Centos7 安装 matplotlib问题
- 【杭电4907】Task schedule
- android 扇形菜单实现,android扇形
- 结构光测量-----visual studio 2010 和 pointgrey 相机SDK (FlyCapture2)配置
- codeforces 274A k-Multiple Free Set
- 最大子序列和 Maximum Subarray
- 最小二乘法 多项式曲线拟合 原理公式理解 Python 实现