goto语句即转移指令,是将cpu的当前的指令指针ip直接更改为goto语句指向的指令地址,然后从该地址继续往后执行。从汇编语言的角度来说,goto语句对应汇编语言的jmp指令,但汇编语言的危险在于jmp指令的跳转侍岁是不受约束或约束较少,机器指令级级别是可以随意跳转的,除非在执行前对指令进行严格检查,这其实是非常困难的。
早期的算法语言,比如fortran、pascal、basic等都支持goto语祥圆句,因为那时的语句较少,分支结构、循环结构需要借助goto语句实现。但这些高级语言对goto语句做了严格的限制,比如:(1)可以从一个结构(条件、循环)内部跳到外部,反之则不允许;(2)不允许从子程序中直接跳出,而要采用类似return的返回语句退出子程序,当然从主程序跳入子程序是绝对禁止的;等等。这些限制对现代还支持goto语句的算法语言仍然起作用。
随着语言的结构化、模块化,有些高级语言已经不再支持goto语句。这样做是为了程序的易读、易懂,便于代码的维护谨谈塌。
目前的编程语言都采迅颤用结构化语言,在结构化程序设计中一般不主张使用goto语句,原因亩汪败为
1、在程序比较简单是用goto语句是比较灵活,但是当程序比较复杂时很容易造成程序流程的混乱。
2、利用goto语句对以后的后别人看陵尺程序是很难理解。
3、调试程序的过程也会变得很困难。
#include
int main()
{
int i = 10, s = 0;
Goto0:
s += i;
i--;
if ( i != 0 )
{
goto Goto0;
}
printf ("s = %d\n", s);
return 0;
}
与
#include
int main()
{
int i = 10, s = 0;
while ( i )
{
s += i;
i--;
}
printf ("s = %d\n", s);
return 0;
}
一个跳来跳去,一个从上往下,你说哪数搜个烦。大项目里做码面如纯毕哪果几个for循环一个goto跳出来,烦死你。
这个你就要先理解什么叫"结悄樱滚构化程序设计"
你现在可能没有编写代码较长的程序,
当代颂让码很长启余后,别人要读取你的代码,
你试想下,如果是没有"goto",别人可以一路顺序的读取下去,
但当你程序里面有很多"goto"后,别人读取的时候就会不停的去找你的goto目的地,不停的上翻下翻.
说得更直接点,如果你用od随便加载个程序,看看反汇编代码,你就会看到有很多JNE,JMP...这类的类似goto语句的东西,你就知道为什么要少用或者不用goto了
简单的程序用用goto没什么问题,如果大的项目的话,可读性就会很差,不利于维护