C++中的goto语句用于跳转程序的执行点至指定位置。从效率上看,goto很高效,从软件工程角度,goto语句的使用容易导致程序逻辑混乱、变得难以理解和维护。

版权声明

本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。

本文不可以以纸质出版为目的进行改编、摘抄。

C语言从更早期的 Fortran语言继承了goto语句,其基本语法格式如下:

1
2
3
4
5
6
标签:
语句;
...
语句;

goto 标签;

当goto语句被执行时,程序将直接跳转到对应标签所在的代码行。上述格式中,第1行的标签后面有一个冒号,这是语法要求。此外,标签定义(第1行)既可位于对应的goto语句前,也可位于goto语句后,也就是说,goto语句既可以实现往前跳转,也可以实现往后跳转。

为了解读goto语句的用法,我们构造了下述C++程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Project - GotoExample
#include <iostream>
using namespace std;

int main(){
int i {1};
int sum {0};

loop:
sum += i;
i++;
if (i<=100)
goto loop;

cout << "sum = " << sum << endl;
return 0;
}

上述代码的执行结果为:

1
sum = 5050

上述程序使用goto语句构造了一个循环,计算1 + 2 + … + 100的和。读者可以把上述代码的第10 ~ 11行视作循环体。

🚩第9行:定义了标签loop。

🚩第12 ~ 13行: 当i<=100时,使用goto语句跳转至loop标签,即第9行。

图4-12中的箭头展示了上述程序中第13行goto语句执行时,程序的跳转方向。

gotoexample

图4-12 goto跳转示意图

goto语句的执行效率很高,但对初学者非常不友好,容易导致程序逻辑混乱、资源泄露等方面的问题。事实上,通过组合使用if else、for/while循环、break、continue等可以避免goto语句的使用。我们给初学者的建议是:不要使用goto语句

对于那些有丰富经验的程序员而言,goto语句的恰当使用,除了获得较高的执行效率之外,有时还可以简化程序的结构。在Linux操作系统的内核代码中,我们可以看到大量的goto语句。当前最流行的手机操作系统之一的Android,基于Linux内核。