关于程序控制逻辑的讨论

简介:
前段时间和大家讨论关于我为什么不用do{}while()的问题,有个网友提出了一些很真知灼见的问题,我也给以了回复,想了一下,写成博文吧,大家都看看。
嗯,一家之言哈,欢迎拍砖。
原文如下:
哈哈,楼主说写代码都有脑子昏的时候,脑子昏的时候可是什么都能写出来。而不是只是看错了while(0)和while(1)。
这个不是我们拒绝do...while的理由。

当然,每个人有每个人的代码风格和规范。比如肖老师的代码规范就是不让用do...while,有些人的代码规范是可以用,但不能用goto。这个都因人而异,所以一转拍死,未必就是好。

不过肖老师的团队的bug数那么少,还是说明肖老师是一个非常严谨的人,带团队也是很有特点的。这个值得我跟肖老师好好的学习下。

还是要问肖老师,如果不用do...while(0)代替goto,肖老师的做法是什么?用while(1){......}?
我的回答:
我的团队允许用goto啊。不过要规范用,简单说有几点: 
1、有限次数循环,一律用for(i=0;i < n;i++),个别需要递减序的,需要报备,大家讨论通过才能用。这里有很多道理,i的取值0~n-1,符合C语言数组的下标规约,永远递增序,表示我们的遍历动作都是从前向后,这样,多个锁联动时,不容易出现“互挂锁”错误,格式统一,大家互相看代码不累,等等。 
2、无限次数循环,永远while(1),这个1可以是我书里面的inline int GetNot0(void)函数,一来格式统一,二来,我如果要做加密,就在这个GetNot0里面做手脚,别人很不好破解。 
3、goto不允许用来做循环,即goto永远不准向前跳,仅用于出错之后,向后跳,然后收拢错误处理逻辑,保证程序只有一个退出点,这在函数中有malloc-free,lock-unlock等二元动作时,非常有用,能避免绝大多数程序员遗忘的bug。 
4、不准用do{}while(),因为我们推论,任何计算都是有先决条件的,几乎所有计算,都应该先判断后计算,后一步必须是前一步正确的前提下进行,无条件的执行,是非法的,也是不合适的。 
嗯,差不多这么多吧,有兴趣的话,建议看看我的书《0bug-C/C++商用工程之道》,里面讲得还要详细点。
 

本文转自 tonyxiaohome 51CTO博客,原文链接:http://blog.51cto.com/tonyxiaohome/318729 ,如需转载请自行联系原作者

相关文章
|
6月前
|
存储 编译器 C++
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用(一)
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用
86 2
|
2月前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
45 2
|
6月前
|
C++
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用(二)
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用
76 2
|
4月前
|
开发者
编程问题之逻辑编程有什么缺点
编程问题之逻辑编程有什么缺点
|
6月前
|
数据库 对象存储
状态机的原理简析及重要用途
状态机的原理简析及重要用途
85 1
|
5月前
|
SQL 数据可视化 算法
掌握计算机逻辑:离散数学中的逻辑和布尔代数
掌握计算机逻辑:离散数学中的逻辑和布尔代数
|
安全 Java API
了解程序运行逻辑的必要性及应用和硬件的关系
了解程序运行逻辑的必要性及应用和硬件的关系
111 0
|
开发工具
彻底搞清游戏开发中的循环逻辑
循环是游戏开发中一定会用到的逻辑,不论是你想控制移动,或者进行遍历,亦或者不停的去执行某一段逻辑,都需要使用循环。那么对于循环的使用你彻底了解了吗?今天这篇文章就帮助你彻底的弄懂微信小游戏开发中的循环的用法。
172 0
|
Unix
【408考研】【收藏必会】操作系统底层逻辑
【408考研】【收藏必会】操作系统底层逻辑
77 0
【408考研】【收藏必会】操作系统底层逻辑
|
异构计算
用有限状态机去理解这个逻辑过程
用有限状态机去理解这个逻辑过程
89 0
用有限状态机去理解这个逻辑过程