在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 判断的...相关推荐

  1. c 语言程序的三种基本结构,C 语言程序的三种基本结构是____ A、顺序结构,选择结构,循环结构 B、递归结构,循环结构,转移结构...

    C 语言程序的三种基本结构是____ A.顺序结构,选择结构,循环结构 B.递归结构,循环结构,转移结构 更多相关问题 [填空题]移动电商,全称 ,是以 为载体的电商模式. [单选题]有关离子选择性电 ...

  2. 8255a初始化c语言程序,8255A的c语言程序.doc

    8255A的c语言程序 8255A的c语言程序 [实例24]用8243扩展I/O端口 #include sbit ContrBit0=P1^0; sbit ContrBit1=P1^1; sbit C ...

  3. 程序设计基础(c语言),程序设计基础(C语言)

    <程序设计基础(C语言)>由会员分享,可在线阅读,更多相关<程序设计基础(C语言)(26页珍藏版)>请在人人文库网上搜索. 1.程序设计基础(C语言),东北大学高级语言程序设计 ...

  4. c语言程序编写字体,c语言程序设计练习题

    c语言程序设计练习题 篇一:c语言程序设计基础单元总结与练习题及答案 <C语言程序设计>单元总结与练习题 答 案 单元一 程序设计宏观认识 单元总结提升 本单元中,核心内容有C语言程序框架 ...

  5. 小组c语言程序项目ppt,C语言程序设计项目八.ppt

    <C语言程序设计项目八.ppt>由会员分享,可在线阅读,更多相关<C语言程序设计项目八.ppt(18页珍藏版)>请在人人文库网上搜索. 1.项目工程8学生成绩文件管理,项目工程 ...

  6. 倒计时报警器c语言程序,求助,c语言c语言倒计时小程序

    求助,c语言c语言倒计时小程序 (2012-04-20 20:11:33) 标签: 杂谈 这个和你自己的电脑掉线和系统有关系吗.我以前的电脑也怀孕可以玩电脑吗,自从买了这个双核新电脑怎么装系统之后就怎 ...

  7. c语言中inline用法,C语言陷阱与技巧第2节,使用inline函数可以提升程序效率,但是让inline函数生效是有条件的...

    打开 Linux 内核源代码,会发现内核在定义C语言函数时,有很多都带有 "inline"关键字,请看下图,那么这个关键字有什么作用呢? inline 关键字的作用 在C语言程序开 ...

  8. 怎么用centos7运行c语言程序_写C语言程序,如何提升程序运行效率?我的一点经验分享给你们!...

    在编写C语言程序后,经常需要对源码进行优化,以提高程序的运行效率,下面简述几个常用的优化技巧以供大家参考: 1.C于代码在程序中的优化 现在的C编译器会自动对代码进行优化,但这些优化是对执行速度和代码 ...

  9. 单纯形 c语言 程序,单纯形法完全c语言程序

    单纯形法完全c语言程序 更新时间:2017/2/8 13:37:00  浏览量:566  手机版 单纯形法完全c语言程序,能运行 #include "math.h" #includ ...

最新文章

  1. 普诺飞思获创新工场新一轮投资,加速神经拟态视觉传感技术商业化
  2. Arm 发布移动端 v9 体系新架构,CPU、GPU、IP全囊括了
  3. GDCM:gdcm::Scanner的测试程序
  4. 树形结构:递归转化为迭代,万能通用方法,分治策略基于栈的实现
  5. 解决SWFUpload在Chrome、Firefox浏览器下session找不到的问题
  6. 期望E==>加权均值(每个元素×它们各自的概率)
  7. 推荐系统第一课 听课记录,边听边打字模式
  8. 2017年全球ETF发展报告
  9. 如何在Mac电脑中设置投屏?Mac投屏,Mac电脑无线投屏教程
  10. 小学生计算机基础知识课件,计算机基础知识课件(图表部份).ppt
  11. JAVA编译器的作用
  12. flink 出现反压场景, 异常场景造成Exceeded checkpoint tolerable failure threshold.
  13. android 涟漪背景,Android 水波效果 | 涟漪效果 实现
  14. Unity3D之矩阵运用
  15. ubuntu安装opencv viz模块
  16. java我的世界114_我的世界114更新了什么_我的世界114更新内容_快吧单机游戏
  17. Linux下的硬盘信息查看
  18. 智学网登录不了java_智学网常见问题解答
  19. 如何设计出更好的 API ?
  20. 弱电计算机机房方案,机房弱电建设方案(主要是安防、布线,无广告).doc

热门文章

  1. 集成学习-蒸汽量预测案例
  2. html select ajax,AJAX 动态加载后台数据 绑定select的方法
  3. 布丰投针试验的仿真和误差估计
  4. Vue快速上手笔记1 - 使用初体验
  5. python报表自动化系列 - Excel单元格(Cell)索引范围对应的所有单元格
  6. 黑鲨helo支持html吗,黑鲨游戏手机Helo综合评测 到底值不值得买
  7. java拆分日期_Java根据控制台输入的特定日期格式拆分日期
  8. SWPUACM第一届程序设计大赛
  9. 在java中改变圆半径_java小例子:打印一个近似圆,要求根据给定半径圆的大小随之发生改变...
  10. 生存分析——KM生存曲线、hazard比例、PH假定检验、非比例风险模型(分层/时变/参数模型)(二)