goto 语句被称为 C 语言中的跳转语句。 用于无条件跳转到其他标签。它将控制权转移到程序的其他部分。 goto 语句一般很少使用,因为它使程序的可读性和复杂性变得更差。 语法 goto 语句示例 让我们来看一个简单的例子,演示如何使用 C 语言中的 goto 语句。 打开 Visual Studio 创建一个名称为:goto 的工程,并在这个工程中创建一个源文件:goto-statment.c,其代码如下所示: #include <stdio.h>
void main()
{
int age;
gotolabel:
printf("You are not eligible to vote!\n");
printf("Enter you age:\n");
scanf("%d", &age);
if (age < 18)
{
goto gotolabel;
}
else
{
printf("You are eligible to vote!\n");
}
}
执行上面代码,得到以下结果 You are not eligible to vote!
Enter you age:
12
You are not eligible to vote!
Enter you age:
18
You are eligible to vote!
为什么不受待见 二十几年前,当计算机编程尚处于起步阶段时,程序流程是由 “GOTO” 语句来控制。 该类语句允许程序员对当前代码行断行,而直接进入另一个不同的代码段。 列表 1 为简单的示例。
编程语言终究开始引入了函数的概念,即允许程序对代码进行断行。 如果已经完成,不再使用 goto 语句来表示代码的断行。 函数调用后,函数将回到下一条指令。列表2 为示例。
这一做法改善了程序结构,提高了可读性。自此,这被视为编写程序的正确方法。 只要看到或想到 goto 语句,就会让软件工程师退缩,产生本能的厌恶。 在 wikipedia 上的解释就是; GOTO语句一直是批评和争论的目标,主要的负面影响是使用GOTO语句使程序的可读性变差,甚至成为不可维护的「面条代码」。 随着[color=var(--weui-LINK)][url=]结构化编程[/url]在二十世纪六十年代到七十年代变得越来越流行,许多计算机科学家得出结论,即程序应当总是使用被称为「结构化」控制流程的命令,以及 if-then-else 语句来替代 GOTO。 甚至在今天,许多程序风格编码标准禁止使用 GOTO 语句。 也有不少人为 GOTO 语句辩护,他们认为只要加以限制地使用 GOTO 语句不会导致低质量的代码,并且在许多编程语言中,一些功能难以在不使用 GOTO 语句的情况下实现。 比如有限状态机的实现、跳出嵌套循环以及异常处理等等。 大概最著名的对于 GOTO 的批评是艾兹格·迪杰斯特拉(Edsger Wybe Dijkstra)在1968年的一篇名为《GOTO陈述有害轮》的论文。 迪杰斯特拉认为不加限制地使用GOTO语句应当从高级语言中废止,因为它使分析和验证程序正确性(特别是涉及循环)的任务变得复杂。
另外一种观点出现在高德纳的Structured Programming with go to Statements [3]中,文章分析了许多常见编程任务,然后发现其中的一些使用GOTO将得到最理想的结构。 限制GOTO 许多语言,如 C 语言和 Java,提供了相关的控制流语句,如 break 和 continue,它们都是有效地被限制的 goto 语句。 它们的作用是无条件跳转,但是只能够跳到循环块结束的位置——继续进入下一循环(continue)或者结束循环(break)
|