怎样检查c语言程序的问题,C语言陷阱与技巧第24节,做代码选择,不一定都要使用 if 判断的...
在C语言程序开发中,实现需求的解决方案往往不止一个。解决一个问题,程序员一般都能够设计出多个解决方案,并写出相应的C语言代码。
可能有读者会觉得,解决问题的话,写出一种方法就可以了,给出多个方法没有意义,因为最终C语言程序也就只能使用其中一个而已,其他方案的工作都浪费了。
也许在其他编程语言的程序开发中,只要解决问题就可以,不过在C语言程序开发中,解决问题往往只是第一步,更多的工作一般都在接下来的精简代码和提升效率上。
这是因为 C语言程序开发常常用在一些资源比较紧张,但是对效率要求又高的项目中。
在解决问题的多个解决方案中,各个方案的效率在不同的条件下使用,差异性常常比较大,所以C语言程序员要想写出优秀的程序,需要根据实际的情况,选择不同的方案。
编译时(compile time),和运行时(run time)
假设解决问题 P 有两套解决方案 funA() 和 funB()。不过,即使有两套解决方案,在实际应用中,也常只使用其中一套。确定解决方案后,作为C语言程序员,确定使用哪一套代码的方法有很多种,不过简要来说,这些选择方法可以分为“编译时”选择和“运行时”选择。
“编译时”选择代码主要借助C语言的预处理语法,下面是一个例子:
void solve(){#ifdef condition funA();#else funB();#endif}上面这段C语言代码使用了 #ifdef 预处理,如果希望使用解决方案 funA(),则C语言程序员应该 #define condition,此时 funB() 的代码不会参与编译。否则 solve() 就会使用解决方案 funB(),编译器不再编译 funA() 的代码。
究竟使用哪种解决方案,在编译时就确定了,所以这种选择方法称为“编译时”选择。
不过有时候C语言程序的用户希望可以在程序运行的过程中修改解决方案,这时显然就不能使用“编译时”选择了,因为要满足这种需求,funA() 和 funB() 的代码都必须参与编译。
void solve(bool cond){if(cond) funA();else funB();}麻烦的“运行时”选择
上面讨论的“运行时”选择相关的C语言代码非常简单,也非常常见,不过这种方法虽然能够解决问题,但是如果需要做选择的代码较多,整个C语言代码就显得啰嗦了。例如:
bool cond = user_choose;void func1(){if(cond) funA();else funB();}void func2(){if(cond) funA();else funB();}显然,可能不止一处需要做解决方案选择,那么就得写多个 if 语句。要是 funcN() 非常多,对于程序员来说,就得写非常多的 if 语句,这显然太麻烦了,而且多处重复的C语言代码也不利于维护。
对于C语言程序本身来说,做多个 if 判断也属于做多次重复工作,这会在一定程度上降低效率。
事实上,究竟使用哪种解决方案,只需要判断一次就可以了,请看:
bool cond = user_choose;void (*funptr)();void init(){if(cond) funptr = funA;else funptr = funB;}void func1(){ funptr();}void func2(){ funptr();}上述C语言代码定义了函数指针 funptr,在 init() 函数中确定其指向,之后就无需再判断 cond 了。可以看出,使用函数指针后的代码相当简洁,而且也非常利于程序员维护,程序本身也无需做太多重复的处理。
事实上,不仅仅在选择解决方案时可以用到这个小技巧,在做程序向前兼容时,利用函数指针做代码选择也是一个不错的小技巧。
小结
本节主要介绍了C语言代码选择的两种方法,按照程序周期来说,可以简要分为“编译时”选择和“运行时”选择。在“运行时”选择中,借助函数指针常常可以精简代码,提升效率。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
举报/反馈
怎样检查c语言程序的问题,C语言陷阱与技巧第24节,做代码选择,不一定都要使用 if 判断的...相关推荐
- c 语言程序的三种基本结构,C 语言程序的三种基本结构是____ A、顺序结构,选择结构,循环结构 B、递归结构,循环结构,转移结构...
C 语言程序的三种基本结构是____ A.顺序结构,选择结构,循环结构 B.递归结构,循环结构,转移结构 更多相关问题 [填空题]移动电商,全称 ,是以 为载体的电商模式. [单选题]有关离子选择性电 ...
- 8255a初始化c语言程序,8255A的c语言程序.doc
8255A的c语言程序 8255A的c语言程序 [实例24]用8243扩展I/O端口 #include sbit ContrBit0=P1^0; sbit ContrBit1=P1^1; sbit C ...
- 程序设计基础(c语言),程序设计基础(C语言)
<程序设计基础(C语言)>由会员分享,可在线阅读,更多相关<程序设计基础(C语言)(26页珍藏版)>请在人人文库网上搜索. 1.程序设计基础(C语言),东北大学高级语言程序设计 ...
- c语言程序编写字体,c语言程序设计练习题
c语言程序设计练习题 篇一:c语言程序设计基础单元总结与练习题及答案 <C语言程序设计>单元总结与练习题 答 案 单元一 程序设计宏观认识 单元总结提升 本单元中,核心内容有C语言程序框架 ...
- 小组c语言程序项目ppt,C语言程序设计项目八.ppt
<C语言程序设计项目八.ppt>由会员分享,可在线阅读,更多相关<C语言程序设计项目八.ppt(18页珍藏版)>请在人人文库网上搜索. 1.项目工程8学生成绩文件管理,项目工程 ...
- 倒计时报警器c语言程序,求助,c语言c语言倒计时小程序
求助,c语言c语言倒计时小程序 (2012-04-20 20:11:33) 标签: 杂谈 这个和你自己的电脑掉线和系统有关系吗.我以前的电脑也怀孕可以玩电脑吗,自从买了这个双核新电脑怎么装系统之后就怎 ...
- c语言中inline用法,C语言陷阱与技巧第2节,使用inline函数可以提升程序效率,但是让inline函数生效是有条件的...
打开 Linux 内核源代码,会发现内核在定义C语言函数时,有很多都带有 "inline"关键字,请看下图,那么这个关键字有什么作用呢? inline 关键字的作用 在C语言程序开 ...
- 怎么用centos7运行c语言程序_写C语言程序,如何提升程序运行效率?我的一点经验分享给你们!...
在编写C语言程序后,经常需要对源码进行优化,以提高程序的运行效率,下面简述几个常用的优化技巧以供大家参考: 1.C于代码在程序中的优化 现在的C编译器会自动对代码进行优化,但这些优化是对执行速度和代码 ...
- 单纯形 c语言 程序,单纯形法完全c语言程序
单纯形法完全c语言程序 更新时间:2017/2/8 13:37:00 浏览量:566 手机版 单纯形法完全c语言程序,能运行 #include "math.h" #includ ...
最新文章
- 普诺飞思获创新工场新一轮投资,加速神经拟态视觉传感技术商业化
- Arm 发布移动端 v9 体系新架构,CPU、GPU、IP全囊括了
- GDCM:gdcm::Scanner的测试程序
- 树形结构:递归转化为迭代,万能通用方法,分治策略基于栈的实现
- 解决SWFUpload在Chrome、Firefox浏览器下session找不到的问题
- 期望E==>加权均值(每个元素×它们各自的概率)
- 推荐系统第一课 听课记录,边听边打字模式
- 2017年全球ETF发展报告
- 如何在Mac电脑中设置投屏?Mac投屏,Mac电脑无线投屏教程
- 小学生计算机基础知识课件,计算机基础知识课件(图表部份).ppt
- JAVA编译器的作用
- flink 出现反压场景, 异常场景造成Exceeded checkpoint tolerable failure threshold.
- android 涟漪背景,Android 水波效果 | 涟漪效果 实现
- Unity3D之矩阵运用
- ubuntu安装opencv viz模块
- java我的世界114_我的世界114更新了什么_我的世界114更新内容_快吧单机游戏
- Linux下的硬盘信息查看
- 智学网登录不了java_智学网常见问题解答
- 如何设计出更好的 API ?
- 弱电计算机机房方案,机房弱电建设方案(主要是安防、布线,无广告).doc
热门文章
- 集成学习-蒸汽量预测案例
- html select ajax,AJAX 动态加载后台数据 绑定select的方法
- 布丰投针试验的仿真和误差估计
- Vue快速上手笔记1 - 使用初体验
- python报表自动化系列 - Excel单元格(Cell)索引范围对应的所有单元格
- 黑鲨helo支持html吗,黑鲨游戏手机Helo综合评测 到底值不值得买
- java拆分日期_Java根据控制台输入的特定日期格式拆分日期
- SWPUACM第一届程序设计大赛
- 在java中改变圆半径_java小例子:打印一个近似圆,要求根据给定半径圆的大小随之发生改变...
- 生存分析——KM生存曲线、hazard比例、PH假定检验、非比例风险模型(分层/时变/参数模型)(二)