是否可以使用该break函数退出几个嵌套for循环?如果是这样,你会怎么做呢?你还可以控制休息退出的循环次数吗?
每个人都知道Dijkstra 给编辑的信件:转到被认为有害的声明(也就是这里 .html脚本和这里的 .pdf)并且从那时起就有一个强大的推动,尽可能避开goto声明.虽然可以使用goto来生成不可维护的,庞大的代码,但它仍然保留在现代编程语言中.甚至Scheme中的高级连续控制结构也可以被描述为复杂的goto.
什么情况下可以使用goto?什么时候最好避免?
作为后续问题:C提供了一对函数setjmp和longjmp,它们不仅可以在当前堆栈帧内,而且可以在任何调用帧中进行转换.这些应该被视为像goto一样危险吗?更危险吗?
Dijkstra本人对这个头衔表示遗憾,他对此不负责任.在EWD1308(也是这里 .pdf)结束时,他写道:
最后是一个短篇小说的记录.1968年,ACM的通讯以" 被认为有害的goto声明 "的标题发表了我的一篇文章,遗憾的是,在后来的几年中,这一期刊最常被引用,但是,经常被作者看到的不多于标题,通过成为一个模板成为我的名声的基石:我们会看到几乎任何X的标题"X被认为有害"的各种文章,包括一个标题为"Dijkstra被认为有害"的文章.但是发生了什么?我提交了一份题为" 反对goto声明的案件 "的论文"为了加快出版速度,编辑已经变成了一封"给编辑的信",并在此过程中给了他一个新的自己的发明名称!编辑是Niklaus Wirth.
关于这个主题的经过深思熟虑的经典论文,与Dijkstra的相关,是结构化编程,由Donald E. Knuth撰写.阅读都有助于重新建立背景和对主题的非教条性理解.在本文中,Dijkstra对此案的观点得到了报道,甚至更为强烈:
Donald E. Knuth:我相信通过提出这样一种观点,我实际上并不同意Dijkstra的观点,因为他最近写了以下内容:"请不要陷入相信我非常悲惨的陷阱.去发言.我有其他人正在一个宗教出来的不舒服的感觉,就好像编程的概念问题可以通过一个单一的技巧来解决,通过编码规则的简单形式! "
我继承了用8051汇编语言编写的10K行程序,需要进行一些更改.不幸的是,它是用最好的意大利面条代码传统写成的.程序 - 作为单个文件编写 - 是CALL和LJMP语句的迷宫(总共约1200个),子程序具有多个入口和/或出口点,如果它们可以被识别为子程序的话.所有变量都是全局的.有评论; 有些是正确的.没有现有的测试,也没有重构预算.
关于应用程序的一些背景知识:代码控制当前在国际上部署的自动售货应用程序中的通信中心.它同时处理两个串行流(在单独的通信处理器的帮助下),并且可以与最多四个不同的物理设备通信,每个物理设备来自不同的供应商.其中一个设备的制造商最近做了一个改变("是的,我们做了一个改变,但软件完全相同!")这导致一些系统配置不再起作用,并且不想改变它(无论它是什么他们没有改变).
该计划最初由另一家公司编写,转让给我的客户,然后由另一位顾问在九年前进行了修改.原始公司和顾问都不是资源.
基于对其中一条串行总线上的流量的分析,我想出了一个看似有效的黑客攻击,但它很难看并且没有解决根本原因.如果我对该计划有了更好的理解,我相信我可以解决实际问题.在代码被冻结之前,我还有大约一周的时间来支持月末发货日期.
原始问题:我需要很好地理解程序,以便在不破坏的情况下进行更改.有没有人开发过处理这种乱七八糟的技术?
我在这里看到一些很棒的建议,但受到时间的限制.但是,我将来可能有另一个机会去寻求一些更复杂的行动方案.
为了扩大读者群,我通过一个详尽的(有些乏味的)现实生活例子重新阐述了我的原始问题。原始问题显示在下面。
Tom刚被聘为Acme Inc.(根据其前两个工作日的表现)担任初级软件工程师。他的工作是用编程语言Acme ++实现由高级软件开发人员设计的算法。公司按照goto首席执行官的独裁命令执行严格的“不”政策。如果汤姆在试用期内表现出色,他将在公司担任全职工作。
在第1天,Tom收到以下要实施的算法。
Step 1. START
Step 2. Input x
Step 3. In case x<0 goto Step 4 otherwise goto Step 5
Step 4. Set x=-x
Step 5. Output x
Step 6. END
Run Code Online (Sandbox Code Playgroud)
Tom认为任务非常复杂,他认为通过将其表示为流程图,可以从研究程序的抽象结构中受益。在绘制了下图第一天的流程图后,他很快意识到,他被要求计算x的绝对值,并且他可以使用简单的if-then-else语句来实现它。汤姆很高兴,他在一天结束时完成了任务。
在第2天,Tom收到以下要实施的算法。
Step 1. START
Step 2. Input x
Step 3. In case x<0 goto Step 2 otherwise goto Step 4
Step 4. Output x
Step 5. END
Run Code Online (Sandbox Code Playgroud)
作为新手,汤姆再次感到最好还是以抽象的方式理解该算法,因此他绘制了以下流程图第二天的流程图。
对流程图的检查表明,Tom被要求执行一个while循环,以等待第一个非负输入。汤姆很高兴,并在一天结束时完成了任务。
基于他出色的表现,汤姆已被公司聘用。
但是,在第3天,汤姆就陷入了深渊,因为他收到了goto由公司前雇员设计的1996年跳高的1000行算法,并且没有其他人知道算法的作用,它是如何做到的,以及为什么首先要以这种方式设计它。但是,这与Tom完全无关,因为他的唯一任务是不管算法是什么都实现该算法。凭借前两天的专业知识,他在具有1997个有向边的1000个节点上绘制了流程图。汤姆非常绝望,他在stackoverflow上询问如何处理这种混乱,有经验的程序员反复建议他这样做。
goto; …问:
最近,我要求测试代码,检测错误并修复问题,我发现很多问题,但这里的主要问题是它自己的代码,spaghetti代码许多代码行以及修复问题的跟踪是如此困难,加上一些代码被复制并粘贴在互联网上,因为它没有任何修改,这个代码没有文档,由于在每件事情中大量使用viewstate,性能是如此糟糕,并且我需要花很多时间来解决这些问题,而且我总是害怕这些时间以后还会出现其他错误.如何处理这个案例,任何有关这个问题的建议都将是一个很大的帮助.
8051 ×1
algorithm ×1
asp.net ×1
assembly ×1
break ×1
c++ ×1
coding-style ×1
embedded ×1
for-loop ×1
goto ×1
math ×1
nested-loops ×1
performance ×1
testing ×1