浅谈结构化程序设计与GOTO语
结构化程序设计的思想与方法
任何复杂的算法,都可以由顺序结构、选择(分支)结构和循环结构三种基本结构组成。
在构造算法时,也仅以这三种结构作为基本单元,同时规定基本结构之间可以并列和互相包含,不允许交叉和从一个结构直接转到另一个结构的内部去。
结构清晰,易于正确性验证和纠正程序中的错误,这种方法就是结构化方法,遵循这种方法的程序设计,就是结构化程序设计。
遵循这种结构的程序只有一个输入口和一个输出口。
结构化程序的概念首先是从以往编程过程中无限制地使用转移语句而提出的。
转移语句可以使程序的控制流程强制性的转向程序的任一处,在传统流程图中,用"很随意"的流程线来描述转移功能。
如果一个程序中多处出现这种转移情况,将会导致程序流程无序可寻,程序结构杂乱无章,这样的程序是令人难以理解和接受的,并且容易出错。
尤其是在实际软件产品的开发中,更多的追求软件的可读性和可修改性,象这种结构和风格的程序是不允许出现的。
为此提出了程序的三种基本结构。
在讨论算法时我们列举了程序的顺序、选择和循环三种控制流程,这就是结构化程序设计方法强调使用的三种基本结构。
算法的实现过程是由一系列操作组成的,这些操作之间的执行次序就是程序的控制结构。
1996年,计算机科学家Bohm和Jacopini证明了这样的事实:任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。
所以,这三种结构就被称为程序设计的三种基本结构。
也是结构化程序设计必须采用的结构。
结构化程序中的任意基本结构都具有唯一入口和唯一出口,并且程序不会出现死循环。
在程序的静态形式与动态执行流程之间具有良好的对应关系。
2.结构化程序设计早期的计算机存储器容量非常小,人们设计程序时首先考虑的问题是如何减少存储器开销,硬件的限制不容许人们考虑如何组织数据与逻辑,程序本身短小,逻辑简单,也无需人们考虑程序设计方法问题。
与其说程序设计是一项工作,倒不如说它是程序员的个人技艺。
程序的三种基本结构
}
}
返回
• 运行情况如下: 3,7,1 • 1, 3, 7
•2.双分支选择语句的形式:
•if(表达式) 语句1 else 语句2
•
见图:
main()
真
{ float x , y; scanf(“%f ”, &x);
if ( x < 0 ) y = 3 - x ;
语句1
else y = 2 * x ; printf(“y= %6.2f”, y );
相等,则执行defau1t后面的语句 n+1。
注意
❖ 语句中的表达式可以是整型或字符型、枚举型。常量表达 式 i 必须与表达式类型一致(整型与字符型通用)。 i 仅 起语句标号作用,不做求值判断。
❖ 语句结构中各个case后常量表达式的值必须互不相同;否 则执行时将出现矛盾。
❖ 各个case的出现次序不影响执行结果。例如,可以先出现 case‘D’:…,然后是case‘A’:……
内嵌if
else
if(expr3) else
statement3 statement4
内嵌if
例 输入两数并判断其大小关系
/*ch4_4.c*/
#include <stdio.h>
main()
{ int x,y;
运行:Enter integer x,y:12,23
printf("Enter integer x,y:");
B
真 P假 AB
多分支选择结构
k k=k1
k=k2
A1
A2 ...
k=kn k=ki
Ai ... An
循环结构 当型循环结构
假 P
浅析C语言中的goto语句
浅析C语言中的goto语句C语言中的goto语句是一种流程控制语句,它允许程序无条件地跳转到程序中的任意位置。
虽然goto语句在现代编程中被广泛认为是不好的实践,但它仍然可以在某些情况下提供一种简洁的控制流程方式。
本文将对C语言中的goto语句进行浅析,探讨其使用场景、优缺点以及避免滥用的方法。
一、goto语句的基本用法在C语言中,可以使用goto语句将程序跳转到代码中任意标记处。
goto语句的一般语法格式为:```goto label;…label: statement;```label是用户自定义的标记,statement是要执行的语句。
当程序执行到goto语句时,会根据标记跳转到对应的语句处执行。
1. 出错处理:在程序中发生错误时,可以使用goto语句跳转到出错处理的位置,释放资源并进行错误处理。
2. 多重循环:在嵌套循环中,使用goto语句可以方便地跳出多重循环,提高代码的可读性。
3. 状态机:在状态机或者有限状态自动机的实现中,goto语句可以简化代码,提高可维护性。
三、goto语句的优缺点虽然goto语句在某些情况下可以提供简洁的解决方案,但它也有一些明显的缺点,因此在大多数情况下应尽量避免使用。
以下是goto语句的一些优缺点:优点:1. 简洁直观:在某些场景下,使用goto语句可以使代码更加简洁和直观。
2. 跳出多重循环:在嵌套循环中,使用goto语句可以方便地跳出多重循环。
缺点:1. 可读性差:过度使用goto语句会导致代码的可读性变差,使程序难以理解和维护。
2. 维护困难:过度使用goto语句会使程序结构混乱,增加程序的维护难度。
3. 容易引发错误:使用goto语句会增加程序出错的可能性,尤其是在跳转到未知位置时。
四、避免滥用goto语句的方法为了避免滥用goto语句,我们可以采取一些方法来限制其使用,并保持程序的可读性和可维护性:1. 使用结构化程序设计:尽量使用结构化的编程方式,避免使用goto语句。
浅谈结构化程序设计与GOTO语
CWinApp* pApp = AfxGetApp();
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;
if (pApp != NULL && !pApp->InitApplication())
其次,goto 语句只在case 结构内使用,所跳转到的位置也在case 结构内,它不会照成大面积的跳转,使程序的阅读者晕头转向;
于是,我们可以认为,在程序模型A中的goto 语句,增加了case 结构的功能。
(2) goto 语句都跳某一共同程序段,并且都是往case结构的出口方向前进。这就保证了带goto 语句的程序的可读性。
我们可以举出很多使用goto 优化程序的例子,比如以下的case结构中经常使用的一种模型:
程序模型A:
switch (Variable)
{
case Value1:
Do specific Value1 here;
goto CommonCaseProcess;
case Value2:
Do Value2 here;
一、结构化程序设计的基本特征
结构化程序设计(Structured Programming)是荷兰学者E.W.Dijkstra等人在研究的人的智力局限性随着程序规模的增大而表现出来的不适应之后,于1969年提出的一种程序设计方法,这是一种复杂任务时避免混乱的技术。提出了把程序结构规范化的主张,要求对复杂问题的求解过程应按我们大脑容易理解的方式进行组织,而不是强迫我们的大脑去接受难以忍受的冲击。具体来说,结构化程序设计的思想包括以下三方面的内容:
goto语句怎么用
goto语句怎么用
goto语句即转移指令,是将cpu的当前的指令指针ip直接更改为goto语句指向的指令地址,然后从该地址继续往后执行。
从汇编语言的角度来说,goto语句对应汇编语言的jmp 指令,但汇编语言的危险在于jmp指令的跳转是不受约束或约束较少,机器指令级级别是可以随意跳转的,除非在执行前对指令进行严格检查,这其实是非常困难的。
早期的算法语言,比如fortran、pascal、basic等都支持goto语句,因为那时的语句较少,分支结构、循环结构需要借助goto语句实现。
但这些高级语言对goto语句做了严格的限制,比如:(1)可以从一个结构(条件、循环)内部跳到外部,反之则不允许;(2)不允许从子程序中直接跳出,而要采用类似return的返回语句退出子程序,当然从主程序跳入子程序是绝对禁止的;等等。
这些限制对现代还支持goto语句的算法语言仍然起作用。
随着语言的结构化、模块化,有些高级语言已经不再支持goto语句。
这样做是为了程序的易读、易懂,便于代码的维护。
但事物总有其两面性,结构化、模块化对程序的执行效率是稍有降低的。
比如:编过八皇后程序后你就会知道,当一个结构有多个出口直接进行“短路”跳转时效率是较高的,如果通过状态变量再通过条件语句进行判断肯定会降低效率。
我想,这也是有些算法语言仍然保留goto语句的因素之一。
就如原子能类似,即可以造福人类也可以对人类带来严重伤害。
goto语句也有其两面性,在程序设计中尽量不用,在追求效率慎重使用。
结构化程序设计
如: disp all for 语文>80 .and. 化学<90 ;
fields 姓名,外语,性别,学号
22
6.3 程序的基本控制结构
1.顺序结构:按语句的先后顺序逐条执行。直 到最后一条语句执行完.
Clear Use c:\XJK LOCATE FOR 姓名=“杨灵” DISP USE
清屏 打开表
查找 显示 关闭
结束
20
编写程序的步骤 (1)明确题目要求解决什么问题 (2)明确输入什么数据,处理什么数据,
输出什么数据。 (3)画出流程图 (4)根据流程图编写程序 (5)运行调试程序
21
输入程序的规则: (1)一行只能输入一个命令且输完后要
按回车键; (2)如果一个命令一行输不下,则要分行
37
X=‘ ‘
@18,10 SAY “请输入1-3” GET X
READ
DO CASE
CASE X=‘1’
CREAT YYY
CASE X=‘2’
USE
YYY
APPE
CASE X=‘3’
EXIT
ENDCASE
38
三.循环结构
一.循环结构:某个程序段的反 复执行的结构;
二.基本格式
39
(1)第一种格式
3. 命令:MODIFY COMMAND 程序文件名
输入命令语句时,必须一条命令占一行,一行写不下时, 在行尾加续行符(;),换行后接着书写该命令语句。
3
命令序列
注释语句 4
6.1.3 程序文件的修改
对已建立的程序文件可以重新进入代码编辑窗口修改内容。 1.项目管理器:选中要修改的程序文件,单击“修改”按 钮,重新打开代码编辑窗口。修改后,选择“文件|保存” 命令,保存程序。 2.菜单:选择“文件|打开”命令,将要修改的程序文件调 入代码编辑窗口。
C语言程序设计转移语句的介绍
C语言程序设计转移语句的介绍
程序中的语句通常总是按顺序方向,或按语句功能所定义的方向执行的。
如果需要改变程序的正常流向,下面我们给大家介绍一下C语言程序设计转移语句吧!
goto,break, Continue和return。
其中的return语句只能出现在被调函数中,用于返回主调函数,我们将在函数一章中具体介绍。
本小节介绍前三种转移语句。
来源:examda
1.goto语句
goto语句也称为无条件转移语句,其一般格式如下:goto 语句标号; 其中语句标号是按标识符规定书写的符号,放在某一语句行的
前面,标号后加冒号(:)。
语句标号起标识语句的作用,与goto 语句配合使用。
如:label: i++;
loop: while(xC语言不限制程序中使用标号的次数,但各标号不得重名。
goto语句的语义是改变程序流向,转去执行语句标号所标识的语句。
C语言初学者入门知识之转移语句
程序中的语句通常总是按顺序方向,或按语句功能所定义的方向执行的。
如果需要改变程序的正常流向,可以使用本小节介绍的转移语句。
在C语言中提供了4种转移语句:(相关资料:/Pages/Details.aspx?id=5749)goto,break, continue和return。
其中的return语句只能出现在被调函数中,用于返回主调函数,我们将在函数一章中具体介绍。
本小节介绍前三种转移语句。
1.goto语句goto语句也称为无条件转移语句,其一般格式如下:goto 语句标号; 其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号(:)。
语句标号起标识语句的作用,与goto 语句配合使用。
如:label: i++;loop: while(x<7);C语言不限制程序中使用标号的次数,但各标号不得重名。
goto语句的语义是改变程序流向,转去执行语句标号所标识的语句。
goto语句通常与条件语句配合使用。
可用来实现条件转移,构成循环,跳出循环体等功能。
但是,在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。
统计从键盘输入一行字符的个数。
#include"stdio.h"void main(){int n=0;printf("input a string\n");loop: if(getchar()!='\n'){n++;goto loop;}printf("%d",n);} int n=0;printf("input a string\n");loop: if(getchar()!='\n'){n++;goto loop;printf("%d",n);本例用if语句和goto语句构成循环结构。
当输入字符不为'\n'时即执行n++进行计数,然后转移至if语句循环执行。
结构化方法
结构化方法很多同学经常在问结构化程序设计方法,今天周老师就来带大家了解一下结构化程序设计,结构化程序设计是指程序的设计、编写和测试都采用一种规定的组织形式进行,这样,可使编制的程序结构清晰,易于读懂,易于调试和修改,充分显示出模块化程序设计的优点。
结构化程序设计(structured programming)是进行以模块功能和处理过程设计为主的详细设计的基本原则。
其概念最早由e.w.dijikstra在年提出的,是软件发展的一个重要的里程碑。
它的主要观点是采用自顶向下、逐步求精及模块化的程序设计方法;使用三种基本控制结构构造程序,任何程序都可由顺序、选择、循环三种基本控制结构构造。
结构化程序设计主要强调的是程序的易读性。
结构化程序设计在年代已经开始发展,科拉多·伯姆及朱塞佩·贾可皮尼伯姆于年5月在《communications of the acm》期刊刊登论文,表明任何一个存有goto指令的程序,可以改成全然不采用goto指令的程序,后来艾兹赫尔·戴克斯特拉在年也明确提出知名的论文《goto陈述有毒论》(go to statement considered harmful),因此结构化程序设计已经开始流行,此概念理论上可以由结构化程序理论所证明,而在实务上,当时也存有像是algol一样,存有多样控制结构的编程语言去同时实现结构化程序设计。
在20世纪70年代初,由boehm和jacobi明确提出并证明的结构定理:即为任何程序都可以由3种基本结构程序形成结构化程序,这3种结构就是:顺序结构、分支(条件挑选)结构和循环结构。
每一个结构只有一个入口和一个出口,3种结构的任一女团和嵌套就形成了结构化的程序。
程序的基本结构存有四种:顺序结构,分支程序结构,循环程序结构,子程序结构。
结构化程序设计的三种基本结构是:顺序结构、选择结构和循环结构。
顺序结构顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的。
vba中goto语句
vba中goto语句在VBA(Visual Basic for Applications)中,`GoTo` 语句用于无条件地将代码跳转到指定的行或标签。
然而,使用`GoTo` 语句经常被认为是不良编程实践,因为它可能导致代码难以理解和维护。
更好的方法是使用结构化的程序设计,例如使用循环和条件语句,以提高代码的可读性和可维护性。
以下是一个简单的示例,演示了如何在VBA中使用`GoTo` 语句:```vbaSub ExampleGoTo()Dim userInput As Integer' Prompt the user for inputuserInput = InputBox("Enter a number:")' Check if the input is negativeIf userInput < 0 Then' If the input is negative, jump to the ErrorHandler labelGoTo ErrorHandlerElse' If the input is non-negative, display a messageMsgBox "You entered a non-negative number."End If' Exit the subroutineExit SubErrorHandler:' Handle the error by displaying an error messageMsgBox "Error: You entered a negative number."' Resume execution after the error handling codeResume NextEnd Sub```在上面的示例中,如果用户输入一个负数,程序将跳转到`ErrorHandler` 标签处,显示错误消息,然后通过`Resume Next` 继续执行代码。
程序的三种基本结构
switch ( i ) {case 1:printf(″A\n″); case 3:printf( ″C\n″); case 4:printf(″D\n″); default:printf(″E\n″); }
假设i=3时,则会从i=3时做起始语句。运行结果见右图。如果给每条语句加上break这样就只执行一条语句。
程序
if后面的表达式类型任意
如:if(a==b&&x==y) printf(“a=b,x=y”); if(3) printf(“OK”); if(‘a’) printf(“%d”,’a’);
语句可以是复合语句 if(x) if(x!=0) if(!x) if(x==0)
程序的三种基本结构
结构化程序设计 基本思想:任何程序都可以用三种基本结构表示,限制使用无条件转移语句(goto) 结构化程序:由三种基本结构反复嵌套构成的程序叫~ 优点:结构清晰,易读,提高程序设计质量和效率 三种基本结构 顺序结构
A
B
A
B
流程图
N-S图
A
B
真
假
P
B
A
真
假
A1
A2
Ai
An
k=k2
k=k1
实现if ~ else 正确配对方法:加{ }
5.2 switch语句 switch语句是多分支选择语句。if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择。例如,学生成绩分类(90分以为‘A’等,80~89分为‘B’等,70~79分为‘c’ 等,……);人口统计分类(按年龄分为老、中、青、少、儿童);工资统计分类;银行存款分类;……等。当然这些都可以用嵌套的if语句或多分支来处理,但如果分支较多,则嵌套的if语句层数多,程序冗长而且可读性降低。C语言提供switch语句直接处理多分支选择,它的一般形式如下: switch (表达式) { case 常量表达式1:语句1 case 常量表达式2:语句2 case 常量表达式i:语句n default :语句n+1 }
C语言结构化程序设计的三种结构
4.2.3算法的伪代码表示
伪代码是对自然语言表示的改进,给自然语言加上了形式化的 框架,以一种简单、容易理解的方式描述算法的逻辑过程,用 伪代码表示的算法无二义性,易于理解。
使用伪代码表示算法无需遵守严格的语法规则,只要完整表达 了意思,书写清晰,容易阅读和读懂即可,举例来说:
用户输入 如果(用户输入的是字符Y) 执行B操作 否则 执行C操作 上述代码便采用了伪代码表示方式,完成了一种简单的分支选
4.2.6取三个数种的最小数
4.3顺序结构设计
A A
B
B
4.3.1顺序结构案例实践
从1加到5,分步顺序执行
int i=0; i+=1; i+=2; i+=3; i+=4; i+=5;
4.4.1分支结构
1
实现单分支选择的形式
2
实现双分支选择的形式
3
实现多分支选择的形式
4.4.2if语句之单分支选择结构
4.4.15 break语句
❖ 一般形式:
❖ 功能:
break;
终止switch语句的执行。为了执行完某个分支
后跳出switch结构,应在其后加上break语句。
4.4.16-break的怪事
把代码中的break都删除或注释掉后,编 译链接并不会出错,只是执行时,结果 不太一样。
我们亲自动手实践一下。 这就是说,如果不使用break语句,那么
4.5.3while 语句——“当型”循环结构
❖ 一般形式: while (表达式) 语句
❖ 说明: “表达式”为循环条件; “语句”为循环体。
❖ 特点: 先判断表达式,后执行语句。
34
=0
表达式
程 序 设 计
条件
语句序列
语句序列
条件
图 6-4 循环结构
信息系统分析与设计
抽象是程序设计的一个好方法。我们很赞成由抽象到具体 的程序设计原则。实际上,这是软件工程的程序设计方法。 从概要设计阶段开始,我们将设计逐步细化,到详细(模 块)设计,在这个阶段,程序的基本框架已经出现端倪, 很多程序的句子轮廓也已基本出来,编程就变得非常简单 了。 数据结构化问题也是很重要的。很多人在编写程序时喜欢 数据结构中数组、指针等数据类型,这样一来,他们可以 采用随机访问的方式,这样很容易产生访问数据的混乱。 采用栈和队列方式取代数组和指针,这样我们就可以用规 范的顺序存取代替随机存取,而避免不必要的麻烦。 1.2 程序设计的好习惯 在编写时具备良好的编程习惯是非常必要,这不是一个小 问题。我们曾经与一家日本软件公司合作,一个模块中的
信息系统分析与设计
程序的输入和输出是与用户打交道的面子工程,应尽可能 使用户方便,且输入和输出的风格要保持一致,不能变化 太大。 1.3 软件质量对程序的要求
我们知道,软件质量的要求有六个,功能性、可靠性、 易使用性、效率、可维护性和可移植性。而程序是构成软 件的很重要组成部分,因此,每一段程序代码对软件的质 量可谓举足轻重。实际上,程序从某一个角度上讲,是软 件的一个缩影,因此,对软件的要求也是对程序的要求, 当然也有一些差别。 比如功能性,如果我们要求某一个模块或程序段完成一个 功能,如果它没有达到,哪怕差那么一点点,即打了折扣, 那是绝大不允许的,因为一个模块或程序段的功能打
信息系统分析与设计
结构化程序设计的概念。由于结构化程序设计,大家普遍 认为的原则有以下几条:
1)尽量使用顺序、选择、重复等基本控制结构表示程序 逻辑;
2)无论是模块还是程序块,应控制只有一个入口和一个 出口;
用goto语句和if语句构成循环
为“循环体”。
特点:先判“表达式(条件)”,后执行语句。
循环体如果包含一个以上的语句,应该以复
合语句形式出现。
在循环体中应有使循环趋向于结束的语句。
[例6.3] 用while循环实现1~100的累加。
100
i
i 1
main() { int i,sum=0; i = 1;
/*为循环赋初值 */
while (i <= 100) /*“当型”循环*/ {
for (i=1;i<=100;i++) sum = sum + i;
“表达式3”,修改循环条件(i++)。 “表达式1”,循环初始条件(i=1)。
这里,循环条件由变量i设定,变量i称为“循环 变量”。 这是for语句的典型用法:已知循环次数。 (本例100次)
[例6.5] 用for循环实现1~100的累加。
i++;
goto loop; /*无条件转向标号loop处的指令 */
}
printf("%d",sum);
}
§6.3 while语句
一般形式:while (表达式) 语句
作用:实现“当型”循环。 当“表达式”非0(真)时,
假 表达式 真
执行while语句中的内嵌“语句”。
语句
“语句”是被循环执行的程序,称
相当于:while(1) 无终止的执行循环体。 6、表达式1可以是设置循环变量初值的赋值表达式,也可以
是其他与循环无关的表达式。
如: for(sum=0,i=1;i<=100;i++,j- - ) sum=sum+i; 7、表达式一般是关系表达式(如i<=100)或逻辑表达式
goto语句符合结构化程序设计的要求。
goto语句符合结构化程序设计的要求。
结构化程序设计是一种编程方法,旨在提高代码的可读性和可维护性。
然而,goto语句通常被认为与结构化程序设计相悖。
goto语句允许程序在执行过程中无条件地跳转到代码的其他部分。
这种跳转机
制使得代码难以理解和调试,因为它打破了顺序性和清晰性。
结构化程序设计的一个核心原则是使用顺序、选择和循环等结构来控制程序流程,使得代码逻辑更加清晰可见。
而goto语句的随意跳转会导致程序流程的混乱,使得代码变得难以理解。
此外,goto语句还容易引发一些编程错误,例如无限循环和死循环。
当程序中
存在多个goto语句时,很容易出现代码覆盖不到的部分,从而导致潜在的逻辑错误。
相比之下,结构化程序设计通过使用条件语句和循环语句,使得程序流程更加可控。
这种结构化的编程风格有助于提高代码质量,减少错误,并且易于维护和调试。
因此,虽然goto语句在某些情况下可能会带来一些方便,但它与结构化程序设
计的目标相冲突,因此在大多数编程语言中已经被弃用或限制使用。
总结来说,尽管goto语句在某些特定场景下可以提供一定的灵活性,但在追求
可读性、可维护性和易于调试的结构化程序设计中,我们应该尽量避免使用goto 语句。
C语言结构化程序设计与GOTO语句之间的关系
C语言结构化程序设计与GOTO语句之间的关系
侯卫周;郭浩;王娟玲
【期刊名称】《平顶山学院学报》
【年(卷),期】2006(021)002
【摘要】讨论了C语言结构化程序的主要特征,提出了"goto"语句在某些特殊场合下的程序设计中的一些使用.
【总页数】3页(P32-34)
【作者】侯卫周;郭浩;王娟玲
【作者单位】河南大学,开封,475001;河南大学,开封,475001;黄河水利职业技术学院,开封,475002
【正文语种】中文
【中图分类】TP391
【相关文献】
1.用Add-in减少VC6.O中goto语句使用错误的研究 [J], 张全法;陈倩
2.汉语句子英译新法详解——汉语句子中意群之间模糊逻辑关系的清晰化 [J], 李田心
3.代码翻译中PERFORM和GOTO语句复合结构的变换 [J], 武成岗;张兆庆;乔如良;冯晓兵;高琳;石学林;蒋弘山;崔慧敏
4.用ON...GOTO...语句更妙 [J], 邹晓翔
5.巧用ONERR GOTO语句画函数图象 [J], 张坤
因版权原因,仅展示原文概要,查看原文内容请购买。
结构化程序设计中,对goto语句描述
结构化程序设计中,对goto语句描述
goto 语句是一种结构化程序设计中被广泛反对的编程技巧,它被普遍认为是一种不良的编程习惯,因为它可能会导致代码难以理解和维护。
goto 语句的滥用可能会导致代码出现不可预测的行为,特别是在多线程或多进程环境下。
使用 goto 语句可能会导致程序出现死锁或资源耗尽等问题。
此外,由于 goto 语句可以穿越函数边界,因此也可能会导致代码难以理解和维护。
相比之下,结构化程序设计鼓励使用模块化的编程方式,将代码分解为独立的函数或类,以便更好地组织和管理代码。
这种模块化的编程方式可以使代码更加清晰和易于维护。
在结构化程序设计中,我们应该尽量避免使用 goto 语句,而是使用函数和模块化的编程方式来组织代码。
如果我们必须使用 goto 语句,我们应该尽可能地将其限制在最少的数量,并确保它们具有明确的含义和用途。
总结起来,goto 语句在结构化程序设计中应该被谨慎使用,只有在必要的情况下才使用。
我们应该尽可能地避免使用 goto 语句,而是使用模块化的编程方式来组织代码,以提高代码的可读性、可维护性和可扩展性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图1 顺序结构图 图2 选择结构图 图3 循环结构图
同时结构化定理还进一步表明,任何一个复杂问题的程序设计都可以用顺序、选择和循环这三种基本结构组成,且它们都具有以下特点:只有一个入口;只有一个出口;结构中无死循环,程序中三种基本结构之间形成顺序执行关系。
以此例可看出,goto 语句能提高程序的效率,但未必必须付出破坏程序可读性的代价。
三、Goto语句与提高程序可读性
用goto语句还能提高程序可读性?回答是肯定的。滥用goto是会破坏程序的可读性,但合理地使用goto语句,除了能提高程序的效率外,还是有可能增加程序的可读性的。
比如,我们经常会遇到类似这样的程序设计问题:要求用户输入一个整数,如果用户输入的整数的值在0到9之间,则让程序完成某个功能,否则要求用户重新输入。如果不用goto语句,任何人都会把程序写成如下的样子:
为了获得结构化的程序,我们不得不对原先的描述进行转化:
从描述(1):“要求用户输入一个整数,如果用户输入的整数的值在0到9之间,则程序继续运行,否则要求用户重新输入。”
转化到
描述(2):“一直做这样的一件事:要求用户输入一个整数,除非用户输入的数在0到9之间。”
这样的转化使得计算机语言同人类语言之间又多了一层隔阂。因为,描述(1)是人类语言最自然的表达方法,却不是结构化程序设计方法所能表达的;描述(2)是用人类语言描述的结构化方法所能接受的直接表达,但对人类来说其含义不如描述(1)直观,不容易理解。在人类阅读上面的两段程序时,程序A给人传达的是描述(2),程序B传达给人的是描述(1),也就是说,程序B更容易被人类理解,非结构化的、用了goto语句的程序B更具可读性。
CWinApp* pApp = AfxGetApp();
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;
if (pApp != NULL && !pApp->InitApplication())
break;
case Value3:
Do specific Value3 here;
goto CommonCaseProcess;
case Value4:
Do specific Value4 here;
CommonCaseProcess:
Do Common Process here;
break;
}
这样写程序是由于case Value1, case Value3, case Value4的处理代码中最后阶段要做相同的事情。如果不使用goto 语句,则有如下两种等效的解决办法:
其次,goto 语句只在case 结构内使用,所跳转到的位置也在case 结构内,它不会照成大面积的跳转,使程序的阅读者晕头转向;
于是,我们可以认为,在程序模型A中的goto 语句,增加了case 结构的功能。
(2) goto 语句都跳某一共同程序段,并且都是往case结构的出口方向前进。这就保证了带goto 语句的程序的可读性。
程序A:
int iInput;
do
{
scanf(“%d”,&iInput);
} while (iInput < 0 || iInput > 9);
这段程序用了循环结构,从而避免了goto 语句。
如果可以使用goto 语句,则可将程序写成这样:
程序B:
int iInput;
GetUserInput:
scanf(“%d”,&iInput);
程序模型B:
switch (Variable)
{
case Value1:
Do specific Value1 here;
Do Common Process here;
break;
case Value2:
Do Value2 here;
break;
case Value3:
Do specific Value3 here;
计算机科学家们一直在努力,使计算机语言接近人类的语言。但在实现这样的梦想以前,如果goto 语句在某些场合能使计算机程序更接近人类语言,我们何不用它!
再举个例子:
这是微软的MFC类库中的一段源程序(稍微做了简化),其作用是做MFC应用程序的初始化工作,如果所有的初始化工作成功,则进入线程的运行,否则,只要在初始化过程中有一步失败,就直接退出。其中所用的goto 语句不仅提高了程序的可读性,也简化了程序的编写。
CommonProcess(parameters);
break;
case Value4:
Do specific Value4 here;
CommonProcess(parameters);
break;
}
不难看出,从结构化程序设计的观点上看,程序模型B和程序模型C都具有优良的可读性。但是,程序B存在代码冗余,如果要更改case Value1, case Value3 和 case Value4 的共同处理的部分,需要同时改变三处相同的代码段,这在程序设计中是很忌讳的。程序模型C使用一个函数调用解决了代码冗余的问题,然而,增加了函数调用的程序运行时间开销和堆栈空间开销,在效率上不如程序模型B。
(2)一个大型程序应按功能分割成一些功能模块,并把这些模块按层次关系进行组织。
(3)在程序设计时应采用自顶向下逐步细化的实施方法。
按结构化程序设计方法设计出的程序优点是:结构良好、各模块间的关系清晰简单、每一模块内都由基本单元组成。这样设计出的程序清晰易读,可理解性好,容易设计,容易验证其正确性,也容易维护。同时,由于采用了“自顶向下、逐步细化”的实施方法,能有效地组织人们的智力,有利于软件的工程化开发。
程序模型A的风格稍差,但从优化程序的角度上看,它结合了程序模型B和程序模型C的优点。由于使用了goto语句,省去了函数调用,没有函数调用的时间开销和空间开销,最多只存在执行直接转移指令所带来的可忽略不计的时间开销(实际上编译系统均会对类似于程序模型B的程序段进行优化,结果会同程序模型A一模一样,这样程序模型A的效率同程序模型B的效率是相同的);并且只使用一段代码解决case Value1, case Value3, case Value4的共同部分,没有代码冗余。程序模型A所付出的代价是使用了goto 语句。不过,基于如下的理由,可以认为这个goto 语句的使用不会对程序的可读性造成致命的破坏:
(1) goto 语句被严格限制在case结构内。
首先,case 结构是很灵活的一个结构,它可以有多个出口,我们也常常使用如下的技巧来实现需要使得两个不同的case有相同的处理的情况:
case a:
case b:
do something here;
break;
这样,作为case 结构的多出口的补充,我们实现了使case a 与 case b有相同的出口。而程序模型A使用的goto语句,是对这种相同出口技巧进一步的补充;
我们可以举出很多使用goto 优化程序的例子,比如以下的case结构中经常使用的一种模型:
程序模型A:
switch (Variable)
{
case Value1:
Do specific Value1 here;
goto CommonCaseProcess;
case Value2:
Do Value2 here;
二、Goto语句与程序设计优化
任何一个结构化程序在编译以后都是需要用机器语言中的直接转移指令语句(同goto完全是一回事)来实现其结构的。在编译时,编译系统常常为了对程序进行优化而加入直接转移指令。其实,在使用高级语言编写程序的阶段,在不影响程序可读性的前提下,我们仍然有可能使用goto语句优化程序,提高程序的运行效率,减少代码的冗余。
一、结构化程序设计的基本特征
结构化程序设计(Structured Programming)是荷兰学者E.W.Dijkstra等人在研究的人的智力局限性随着程序规模的增大而表现出来的不适应之后,于1969年提出的一种程序设计方法,这是一种复杂任务时避免混乱的技术。提出了把程序结构规范化的主张,要求对复杂问题的求解过程应按我们大脑容易理解的方式进行组织,而不是强迫我们的大脑去接受难以忍受的冲击。具体来说,结构化程序设计的思想包括以下三方面的内容:
Do Common Process here;
break;
case Value4:
Do specific Value4 here;
Do Common Process here;
break;
}
程序模型C:
void CommonProcess(parameters)
{
Do common process here;
goto InitFailure;
if (!pThread->InitInstance())
{
if (pThread->m_pMainWnd != NULL)
pThread->m_pMainWnd->DestroyWindow();
nReturnCode = pThread->ExitInstance();
goto InitFailure;
if (iInput < 0 || iInput > 9) goto GetUserInput;
显然,第二段程序是在现今的程序设计教科书中见不到的,因为它不是结构化的。
用结构化程序设计风格设计的程序具有良好的可读性,但这并不代表风格好的程序都是用了结构化的方法。