C语言学习笔记之再谈GOTO

15 sec read

在先前学习C语言控制流中,有讲到GOTO,但讲的不够具体,关于是否要在C语言代码中使用GOTO语法存在很大的争论,关于GOTO语句,其中两篇最著名的文章为:

其中Dijkstra主张完全摒弃goto语句的使用,Knuth则主张严格的去使用goto语句,虽然主张不一样,但是他们都同意:代码是静态的文本,计算是动态的过程;静态的代码作为描述动态的计算的媒介,要让程序员能够清楚地了解reason about computation才不至于引入Bug。

结构化编程的顺序、分支、循环三种控制结构提供了简单的控制流。如果画成流程图,形状都简单。顺序结构自不必说,每一条语句都是一个盒子,只有一个入口一个出口。同时,可以把顺序结构的连续若干条语句整体视作一个盒子,只有一个入口一个出口。而分支结构、循环结构在必要的时候也可以视作一个盒子,只有一个入口一个出口。这两种结构的内部流程,一方面可以局部地看,另一方面可以把内部的嵌套结构视作盒子。那么在不使用goto语句,而只使用三种控制结构的情况下,任何一个C函数的流程图,通过把适当的连续的语句视作一个盒子,都可以是三种控制结构之一的最简单形态。而这种粗粒度的流程图的每一个盒子,又可以局部地看。这就使得“关注点分离”成为可能。于是程序员可以相对较容易地推断程序在某一时刻是否满足期望的状态和不变性(invariant)。

Goto语句的问题在于,没有原则的goto语句的使用(undisciplined use of goto statements)容易使程序控制流变乱,使得上述由粗粒度到细粒度的阅读变得困难,背离了关注点分离原则,严重影响程序员reason about computation。Goto语句甚至可以使得流程图不是一个平面图(planar graph)。

Knuth赞成节制地使用goto语句。如果有什么原则要遵循的话,我想应该是让程序员能够容易地reason about computation。Knuth在他的作品TeX里多处使用了goto语句,但是代码仍然很清晰。有兴趣的读者可以参阅 TeX: The Program。C++ STL的设计者Alexander Stepanov也是Knuth关于goto语句看法的追随者。他在给A9员工的课程中提到,在程序逻辑可以建模成有限状态机(finite state automata)的时候,就可以使用goto语句。

那么问题来了,如何有限定的去使用GOTO?答案是限定为向外层、向后跳。

参考链接:https://www.zhihu.com/question/66415361

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

含C/C++代码包Anaconda安装问题

上篇文章主要讲了libffm在Windows系统下安装遇到的问题,今天在Linux环境下的Anaconda中安
1 min read

FFM/libffm在Windows上的使用

FFM 的作者Yu-Chin Juan在GitHub上开源了C++版本的代码libffm,由于日常的数据处理都
5 min read

使用Python获取照片Exif信息

什么是Exif? Exif(Exchangeable image file format)是专门为数码相机的照
4 min read

发表评论

电子邮件地址不会被公开。 必填项已用*标注