goto语句即转移指令,是将cpu的当前的指令指针ip直接更改为goto语句指向的指令地址,然后从该地址继续往后执行。从汇编语言的角度来说,goto语句对应汇编语言的jmp指令,但汇编语言的危险在于jmp指令的跳转是不受约束或约束较少,机器指令级级别是可以随意跳转的,除非在执行前对指令进行严格检查,这其实是非常困难的。
早期的算法语言,比如fortran、pascal、basic等都支持goto语句,因为那时的语句较少,分支结构、循环结构需要借助goto语句实现。但这些高级语言对goto语句做了严格的限制,比如:(1)可以从一个结构(条件、循环)内部跳到外部,反之则不允许;(2)不允许从子程序中直接跳出,而要采用类似return的返回语句退出子程序,当然从主程序跳入子程序是绝对禁止的;等等。这些限制对现代还支持goto语句的算法语言仍然起作用。
随着语言的结构化、模块化,有些高级语言已经不再支持goto语句。这样做是为了程序的易读、易懂,便于代码的维护。但事物总有其两面性,结构化、模块化对程序的执行效率是稍有降低的。比如:编过八皇后程序后你就会知道,当一个结构有多个出口直接进行“短路”跳转时效率是较高的,如果通过状态变量再通过条件语句进行判断肯定会降低效率。我想,这也是有些算法语言仍然保留goto语句的因素之一。
就如原子能类似,即可以造福人类也可以对人类带来严重伤害。goto语句也有其两面性,在程序设计中尽量不用,在追求效率慎重使用。
百度百科的示例代码:
http://baike.baidu.com/view/3209842.htm
统计从键盘输入一行字符的个数。
#include"stdio.h"
int main(void)
{
int n=0;
printf("input a string :\n");
loop: if(getchar()!='\n')
{
n++;
goto loop;
}
printf("%d",n);
}
例如输入:ahifhoaishfoasdfkasg
然后回车Enter
输出:20
=====================
注意那个loop后面有个冒号,这个叫做标签Label,你在程序里写了标签之后,可以用goto语句跳到那个标签的地方,就这么简单。