当我学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

C语言代码里不能用goto?的更多相关文章

  1. C 语言代码风格之 Linux 内核代码风格

    GitHub: https://github.com/storagezhang Emai: debugzhang@163.com 华为云社区:https://bbs.huaweicloud.com/b ...

  2. OJ提交题目中的语言选项里G++与C++的区别(转)

    G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式. ...

  3. ZZC语言代码风格

    程序员之路--关于代码风格 优秀的代码风格如同一身得体的打扮,能够给人以良好的印象.初学程序设计,首先必须建立良好的编程习惯,这其中就包括代码风格.本文就代码风格中的几个重点问题进行了讨论,并在文后给 ...

  4. OJ提交题目中的语言选项里G++与C++的区别(转载)

    原文链接:http://blog.polossk.com/201405/c-plus-plus-g-plus-plus G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编 ...

  5. 一统江湖的大前端(5)editorconfig + eslint——你的代码里藏着你的优雅

    <一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...

  6. 如何提高单片机C语言代码效率

    代码效率包括两个方面内容:代码的大小和代码执行速度.如果代码精简和执行速度快,我们就说这个代码效率高.一般情况下,代码精简了速度也相应提上来了.单片机的ROM和RAM的空间都很有限,当您编程时遇到单片 ...

  7. 使用highlight.js高亮静态页面的语言代码

    显示静态的代码其实html的pre标签基本可以满足需求了,至少不会将换行的文本显示成一堆字符串. 不过能使静态的文本能高亮显示,倒更炫酷一点.其实很简单的,引入highlight.js包,可以使用cd ...

  8. 【转】OJ提交题目中的语言选项里G++与C++的区别

    原文链接:http://blog.polossk.com/201405/c-plus-plus-g-plus-plus G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编 ...

  9. 国际语言代码 Language Code

    语言代码 语言名称 af 南非语 af-ZA 南非语 ar 阿拉伯语 ar-AE 阿拉伯语(阿联酋) ar-BH 阿拉伯语(巴林) ar-DZ 阿拉伯语(阿尔及利亚) ar-EG 阿拉伯语(埃及) a ...

随机推荐

  1. webpack新版本4.12应用九(配置文件之多种配置类型)

    除了导出单个配置对象,还有一些方式满足其他需求. 导出为一个函数 最终,你会发现需要在开发和生产构建之间,消除 webpack.config.js 的差异.(至少)有两种选项: 作为导出一个配置对象的 ...

  2. JsQuick--个人封装的Js库

    JsQuick 该库为本人封装的Js库,尚未进行浏览器兼容 /** * 快速框架 版本:1.0.0 * 日期:2015.02.26 * 作者:简楚恩 */ /** * 快速获取控件类 */ var $ ...

  3. 设置正确的DNS

    上网或下载软件慢问题,除去少数设备陈旧.感染病毒.网卡硬件故障和网卡驱动错误方面的因素,绝大部分原因是由于部分上网电脑或家用无线路由器设置了错误的DNS造成的,正确的方法是应该在电脑或路由器上使用本地 ...

  4. ecshop其他页面判断是智能手机访问也跳转到ECTouch对应手机版页面(转)

    ecshop 其他页面(商品详情页.商品分类页.团购页.优惠活动页.积分商城) 判断如果是智能手机访问跳转到ECTouch1.0手机版对应页面 方法 首先在ecshop 根目录下 includes/l ...

  5. Restore Nexus 5 to Stock and Flash Factory Images

    1.This is the website to download Factory Images for Nexus Devices https://developers.google.com/and ...

  6. POJ2142(扩展欧几里得)

    The Balance Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5991   Accepted: 2605 Descr ...

  7. 【转】JMeter基础之——一个简单的性能测试

    上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站是fnng.cnblogs.co ...

  8. 转载:Oracle RAC日常基本维护命令

    本文转载自: https://blog.csdn.net/tianlesoftware/article/details/5358573 Oracle RAC日常基本维护命令 好文转载, Oracle  ...

  9. DB2的安装

    jiangxin@db01:~$ su – root #切换到root用户 密码: root@db01:~# uname -a #查看内核和操作系统信息 Linux db01 4.4.0-66-gen ...

  10. Deep Learning 学习笔记(8):自编码器( Autoencoders )

    之前的笔记,算不上是 Deep Learning, 只是为理解Deep Learning 而需要学习的基础知识, 从下面开始,我会把我学习UFDL的笔记写出来 #主要是给自己用的,所以其他人不一定看得 ...