前段时间和大家讨论关于我为什么不用do{}while()的问题,有个网友提出了一些很真知灼见的问题,我也给以了回复,想了一下,写成博文吧,大家都看看。
嗯,一家之言哈,欢迎拍砖。
原文如下:
我的回答:
我的团队允许用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++商用工程之道》,里面讲得还要详细点。
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++商用工程之道》,里面讲得还要详细点。
=======================================================
在线底价购买我的书《0bug-C/C++商用工程之道》
(直接点击下面链接或拷贝到浏览器地址栏)
http://s.click.taobao.com/t_3?&p=mm_13866629_0_0&n=23&l=http%3A%2F%2Fsearch8.taobao.com%2Fbrowse%2F0%2Fn-g%2Corvv64tborsvwmjvgawdkmbqgboq---g%2Cgaqge5lhebbs6qzlfmqmttgtyo42jm6m22xllqa-------------1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C14%2C15%2C16%2C17%2C18%2C19%2C20---40--coefp-0-all-0.htm%3Fpid%3Dmm_13866629_0_0
在线底价购买我的书《0bug-C/C++商用工程之道》
(直接点击下面链接或拷贝到浏览器地址栏)
http://s.click.taobao.com/t_3?&p=mm_13866629_0_0&n=23&l=http%3A%2F%2Fsearch8.taobao.com%2Fbrowse%2F0%2Fn-g%2Corvv64tborsvwmjvgawdkmbqgboq---g%2Cgaqge5lhebbs6qzlfmqmttgtyo42jm6m22xllqa-------------1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C14%2C15%2C16%2C17%2C18%2C19%2C20---40--coefp-0-all-0.htm%3Fpid%3Dmm_13866629_0_0
本文转自 tonyxiaohome 51CTO博客,原文链接:http://blog.51cto.com/tonyxiaohome/318729 ,如需转载请自行联系原作者
这个不是我们拒绝do...while的理由。
当然,每个人有每个人的代码风格和规范。比如肖老师的代码规范就是不让用do...while,有些人的代码规范是可以用,但不能用goto。这个都因人而异,所以一转拍死,未必就是好。
不过肖老师的团队的bug数那么少,还是说明肖老师是一个非常严谨的人,带团队也是很有特点的。这个值得我跟肖老师好好的学习下。
还是要问肖老师,如果不用do...while(0)代替goto,肖老师的做法是什么?用while(1){......}?