当我学C语言时,老师整天告诉我:"不要使用goto, 这是一个坏习惯, 这种写法很烂,而且很危险!"等等。

但是为什么那么多内核程序员那么喜欢用goto呢?

在这段linux内核 https://github.com/torvalds/linux/blob/master/kernel/sched/clock.c  代码里,我觉得可以用简单的一个while替换掉,如:

while(condition)
{
}
//或
do
{
}while(condition);

注:这段代码来自torvalds的linux内核代码,其实不仅可以使用while,还有很多地方可以使用if () {} else {} 的结构代替,很多内核的其他文件也是如此,如 fs.open  http://lxr.linux.no/linux+v3.12.6/fs/open.c#L464 对此我很不理解,在某些情况下使用goto比while/do-while好吗?如果是的话,为什么呢?

注: 这也许从另一个角度诠释了差点的更好Worse Is Better 的观点。

by: musicmatze

来自国外网友的精彩评论:

回答一:

对于这个例子中,我估计是从原来SMP不安全(non-SMP-safe)的方式改成SMP的方式。使用goto语句对原来的代码改动量最小,引起潜在风险的概率最小。

我其实也不赞成你们用这种方式,但我认为绝对不要使用goto也是一种误导。在一个只会向前走,绝不会后退的函数里,使用goto绝对不会引起死循环,而且这种方式绝对是最简单最清楚的跳转方式。(如通过在清理代码和返回错误时使用)

by: R..

回答二:

历史:我们也许记得Dijkstra 在1968年写的 Goto Considered Harmfulhttp://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html, 现在快半个世纪过去了。外面已经很少看到goto了。

不过我们来分析一下这个例子,一个关于错误处理的,让我们用结构化的语法来写:

if (do_something() != ERR) {
if (do_something2() != ERR) {
if (do_something3() != ERR) {
if (do_something4() != ERR) {
...

那么,换成goto呢?

if (do_something() == ERR) //一行
goto error; //
if (do_something2() == ERR) //一行
goto error; //
if (do_something3() == ERR) //一行
goto error; //
if (do_something4() == ERR) // 使用普通的平铺形式
goto error;

我们看到这段代码都是平级的,不相互依辣的,明显goto的结构更好。

by: Dietrich Epp

来自国内网友的精彩评论

夜晚的风雪 2014-01-09 21:04

一 句话解释"写汇编写惯了"。对于写应用程序的人来说,if,while自然是熟悉的不能再熟悉,但是系统程序员不同,由于要和硬件打交道比较多,经常写汇 编。尤其对于某些大神而言,可能用汇编还习惯些,比如早期的linux内核代码有大量的汇编。汇编里面没有所谓的if,while,基本上就是无条件和有 条件跳转。所以用熟了,习惯使然吧。

刘江总编 2014-01-09 16:05
其实goto语句的问题,在《代码大全》(Code Complete)一书中有17.3专门一节详细讲述支持(以Knuth大神为首)和反对(以Dijkstra大神为首)两方的观点。最后作者本人的结论 是:90%情况下用goto都是错的,但少数情况goto确实有效(比如在错误处理中的多重判断,又如两个条件判断和一个else子句的情况),是解决问 题的合理办法。这时候用goto无妨,但应该加注释说明理由。

查到这一节英文网上有:http://www.stevemcconnell.com/ccgoto.htm

最新文章

  1. 《C与指针》读后感
  2. 【Leafletjs】6.Control.Loading推展-在地图上边框添加加载动态条
  3. Xcode 编译的哪些错误
  4. bzoj 2818: Gcd GCD(a,b) = 素数
  5. java基础程序设计学习
  6. GCD多线程
  7. JFrome 登陆/注册/回显/输出流小程序之二
  8. git创建分支
  9. 屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能载入页面
  10. Maxmum subsequence sum problem
  11. MySQL数据库—日期与时间函数
  12. 小强的HTML5移动开发之路(12)——从一个多媒体标签说起
  13. win10下安装ubantu
  14. [HNOI2015]落忆枫音 解题报告
  15. Asp.Net Core基于Cookie实现同域单点登录(SSO)
  16. Dynamic Programming-650. 2 Keys Keyboard
  17. IOS和安卓WEB页面,input输入框被软键盘遮挡解决方法
  18. java面试 关键字
  19. java反射机制学习代码
  20. 开源应用框架BitAdminCore:更新日志20180605

热门文章

  1. vue前端开发那些事——vue开发遇到的问题
  2. jquery移除、绑定、触发元素事件
  3. rest_framework使用完之后的简单总结
  4. 洛谷【P1064】金明的预算方案
  5. (转)java.lang.RuntimeException: Missing type parameter
  6. Windows2008 R2上完全卸载Oracle操作步骤(转)
  7. eclipse配置项目部署到到本地tomcat
  8. 【转】JMeter代理录制脚本
  9. 【转】Jmeter MySQL数据库性能测试
  10. AngularJS:教程