关于goto语句的使用浅谈

上传人:宝路 文档编号:22002466 上传时间:2017-11-25 格式:DOC 页数:9 大小:30.56KB
返回 下载 相关 举报
关于goto语句的使用浅谈_第1页
第1页 / 共9页
关于goto语句的使用浅谈_第2页
第2页 / 共9页
关于goto语句的使用浅谈_第3页
第3页 / 共9页
关于goto语句的使用浅谈_第4页
第4页 / 共9页
关于goto语句的使用浅谈_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《关于goto语句的使用浅谈》由会员分享,可在线阅读,更多相关《关于goto语句的使用浅谈(9页珍藏版)》请在金锄头文库上搜索。

1、本文中引述了很多网友的观点,在此非常感谢热心网友. 一.历史背景 goto 语句问题的提出直接导致了计算学科程序设计语言的产生. goto 语句的发展历程 问题起源: 60 年代中期以后,计算机硬件技术日益进步,计算的存贮容量、运算速度和可靠性明显提高,生产硬件的成本不断降低。计算机价格的下跌为它的广泛应用创造了极好的条件。在这种形势下,迫切要求计算机软件也能与之相适应。因而,一些开发大型软件系统的要求提了出来。然而软件技术的进步一直未能满足形势发展的需要,在大型软件的开发过程中出现了复杂程度高、研制周期长、正确性难以保证的三大难题。遇到的问题找不到解决办法,致使问题堆积起来,形成了人们难以控

2、制的局面,出现了所谓的“软件危机” 。为了克服这一危机,一方面需要对程序设计方法、程序的正确性和软件的可靠性等问题进行系列的研究;另一方面,也需要对软件的编制、测试、维护和管理的方法进行研究,从而产生了程序设计方法学。 goto 语句是有害的观点: 1968 年,EW代克斯特拉首先提出“goto 语句是有害的”论点,向传统程序设计方法提出了挑战,从而引起了人们对程序设计方法讨论的普遍重视。 goto 语句的争论: 在 60 年代末和 70 年代初,关于 goto 语句的用法的争论比较激烈。主张从高级程序语言中去掉 goto 语句的人认为,goto 语句是对程序结构影响最大的一种有害的语句,他们

3、的主要理由是:goto 语句使程序的静态结构和动态结构不一致,从而使程序难以理解,难以查错。去掉 goto语句后,可直接从程序结构上反映程序运行的过程。这样,不仅使程序结构清晰,便于理解,便于查错,而且也有利于程序的正确性证明。 持反对意见的人认为,goto 语句使用起来比较灵活,而且有些情形能提高程序的效率。若完全删去 goto 语句,有些情形反而会使程序过于复杂,增加一些不必要的计算量。 关于 goto 语句的解决方法: 1974 年,DE克努斯对于 goto 语句争论作了全面公正的评述,其基本观点是:不加限制地使用 goto 语句,特别是使用往回跳的 goto 语句,会使程序结构难于理解

4、,在这种情形,应尽量避免使用 goto 语句。但在另外一些情况下,为了提高程序的效率,同时又不致于破坏程序的良好结构,有控制地使用一些 goto 语句也是必要的。用他的话来说就是:“在有些情形,我主张删掉 goto 语句;在另外一些情形,则主张引进 goto 语句。 ”从此,使这场长达 10 年之久的争论得以平息。 后来,G加科皮尼和 C波姆从理论上证明了:任何程序都可以用顺序、分支和重复结构表示出来。这个结论表明,从高级程序语言中去掉goto 语句并不影响高级程序语言的编程能力,而且编写的程序的结构更加清晰。 goto 语句的结果: 在 C/C+等高级编程语言中保留了 goto 语句,但被建

5、议不用或少用。在一些更新的高级编程语言,如 Java 不提供 goto 语句,它虽然指定 goto作为关键字,但不支持它的使 用,使程序简洁易读;尽管如此后来的 c#还是支持 goto 语句的,goto 语句一个好处就是可以保证程序存在唯一的出口,避免了过于庞大的 if 嵌套。 二.可以考虑使用 goto 的情形 1.从多重循环中直接跳出 很多人建议废除 C+/C 的 goto 语句,以绝后患。但实事求是地说,错误是程序员自己造成的,不是 goto 的过错。goto 语句至少有一处可显神通,它能从多重循环体中一下子跳到外面,用不着写很多次的 break 语句。例如: for(.) for(.)

6、 for(.) / 如何冲出重重包围? break;只能跳出单层的循环,return 将整个函数都返回了,没法再继续了,显然也不行,所以我们想到了 goto。如果是在陷入了很深层次的循环里想要跳出最外层的循环,用 goto 直接跳出却比用 break 一个循环一个循环地跳出要好得多。有人甚至形象比喻说:“就像楼房着火了,来不及从楼梯一级一级往下走,可从窗口跳出火坑。 ” 其实,你可以将 break 和 continue 理解成弱化了的 goto 语句。 2. 出错时清除资源 如果一个函数有多个出口,则在每个出口处,会产生巨大的退出代码,如下例一,每个函数只能有一个出口,所有的资源释放必须放在出

7、口统一解决,那全部使用大括号,十几个,几十个 if 判断条件下来,你数数你的大括号有多深?这种代码可读性不好,一旦写错了,难于寻找错误。所有这些问题,一个 goto 就解决了。 当程序要分配和清除资源时(像内存、或处理字形、窗口、打印机) ,这种情形下用 goto 通常是为了复制代码或清除资源。若遇到这种情况,程序员就要掂量是 goto 的缺点令人讨厌呢?还是复制代码那令人头痛的维护更讨厌呢?最后还是认为 goto 的缺点更可忍受。 例子一:不用 goto,想想需要申请的指针是 10 个的话,程序怎么写? void Func(void) char* p1=null; char* p2=null

8、; char* p3=null; p1=(char*)malloc(10); if(!p1) return; p2=(char*)malloc(10); if(!p2) free(p1); p1=null; return; p3=(char*)malloc(10); if(!p3) free(p1); p1=null; free(p2); p2=null; return; /指针使用过程 if(p1) free(p1); p1=null; if(p2) free(p2); p2=null; if(p3) free(p3); p3=null; 例子二:用 goto void Func(void)

9、 char* p1=null; char* p2=null; char* p3=null; p1=(char*)malloc(10); if(!p1) goto Func_End_Process; p2=(char*)malloc(10); if(!p2) goto Func_End_Process; p3=(char*)malloc(10); if(!p3) goto Func_End_Process; /指针使用过程 Func_End_Process: if(p1) free(p1); p1=null; if(p2) free(p2); p2=null; if(p3) free(p3);

10、p3=null; 3.可增加程序的清晰度的情况。 若不使用 goto 语句会使功能模糊,有时候使用 goto 语句,一眼就看清楚了程序的意图,可用那些对应的循环 break 语句等实现的语句段 ,要想老半天才搞清楚程序意图的情况,也可考虑使用 goto 语句。三.不加限制地使用 goto 带来的弊端 1).很明显,不加限制地使用 goto 破坏了清晰的程序结构,使程序的可读性变差,甚至成为不可维护的面条代码 。例如下例: code=C/C+ A: /code section A /code goto B; /code goto C; B: /code section B /code goto

11、A; /code goto C; C: /code section C /code /goto B; /code goto A; /code 这样好像已经能够说明问题了,随着标签的增多,带来的混乱局面是很难扭转的,对调试,走读,理解代码都会造成很大的障碍,如果你写这样的代码,那代码维护绝对会是一场 噩梦。 2). 不加限制地使用 goto 经常带来错误或隐患。它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句,例如: goto state; String s1, s2; / 被 goto 跳过 int sum = 0; / 被 goto 跳过 . state: 如果编译器不能发觉此类错

12、误,每用一次 goto 语句都可能留下隐患。四.Goto 语句与结构化程序设计 goto 语句问题的提出直接推动了结构化程序设计(structured programming)的思想和程序设计方法学的诞生和发展。结构化程序设计方法引入了工程思想和结构化思想,使大型软件的开发和编程都得到了极大的改善。 结构化程序设计方法的主要原则可以概括为自顶向下,逐步求精,模块化,限制使用 goto 语句。 1自顶向下:程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。 2逐步求精:对复杂问题,应设计一些子目标作为

13、过渡,逐步细化。 3模块化:一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解为子目标,再进一步分解为具体的小目标,把每一个小目标称为一个模块。 4限制使用 goto 语句 结构化程序设计方法的起源来自对 goto 语句的认识和争论。肯定的结论是,在块和进程的非正常出口处往往需要用 goto 语句,使用 goto 语句会使程序执行效率较高;在合成程序目标时,goto 语句往往是有用的,如返回语句用 goto。否定的结论是,goto 语句是有害的,是造成程序混乱的祸根,程序的质量与 goto 语句的数量呈反比,应该在所有高级程序设计语言中取消 goto 语句。取消 go

14、to 语句后,程序易于理解、易于排错、容易维护,容易进行正确性证明。作为争论的结论,1974 年 Knuth 发表了令人信服的总结,并证实了: (1)goto 语句确实有害,应当尽量避免; (2)完全避免使用 goto 语句也并非是个明智的方法,有些地方使用goto 语句,会使程序流程更清楚、效率更高。 (3)争论的焦点不应该放在是否取消 goto 语句上,而应该放在用什么样的程序结构上。其中最关键的是,应在以提高程序清晰性为目标的结构化方法中限制使用 goto 语句五.关于 goto 使用语句的一些建议 goto 语句在结构化编程技术出来后,被当作破坏结构化程序的典型代表,可以说,在结构化程

15、序设计年代,goto 语句就像洪水猛兽一样,程序员都唯恐避之不及;可后来在微软的一些例子程序中经常把 goto 语句用来处理出错,当出错时,goto 到函数要退出的一个 label 那里进行资源释放等操作。那么,goto 语句是不是只可以用于出错处理,其他地方都不可以用了呢?下列关于使用 goto 语句的原则可以供读者参考。 1) 使用 goto 语句只能 goto 到同一函数内,而不能从一个函数里 goto 到另外一个函数里。 2) 使用 goto 语句在同一函数内进行 goto 时,goto 的起点应是函数内一段小功能的结束处,goto 的目的 label 处应是函数内另外一段小功能的开始处。 3) 不能从一段复杂的执行状态中的位置 goto 到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。 4)应该避免像两个方向跳转。这样最容易导致面条代码。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号