C++中的goto语句用于跳转程序的执行点至指定位置。从效率上看,goto很高效,从软件工程角度,goto语句的使用容易导致程序逻辑混乱、变得难以理解和维护。
C语言从更早期的 Fortran语言继承了goto语句,其基本语法格式如下:
标签:
语句;
...
语句;
goto 标签;
当goto语句被执行时,程序将直接跳转到对应标签所在的代码行。上述格式中,第1行的标签后面有一个冒号,这是语法要求。此外,标签定义(第1行)既可位于对应的goto语句前,也可位于goto语句后,也就是说,goto语句既可以实现往前跳转,也可以实现往后跳转。
为了解读goto语句的用法,我们构造了下述C++程序:
//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;
}
上述代码的执行结果为:
sum = 5050
上述程序使用goto语句构造了一个循环,计算1 + 2 + … + 100的和。读者可以把上述代码的第10 ~ 11行视作循环体。
🚩第9行:定义了标签loop。
🚩第12 ~ 13行: 当i<=100时,使用goto语句跳转至loop标签,即第9行。
图4-12中的箭头展示了上述程序中第13行goto语句执行时,程序的跳转方向。
goto语句的执行效率很高,但对初学者非常不友好,容易导致程序逻辑混乱、资源泄露等方面的问题。事实上,通过组合使用if else、for/while循环、break、continue等可以避免goto语句的使用。我们给初学者的建议是:不要使用goto语句。
对于那些有丰富经验的程序员而言,goto语句的恰当使用,除了获得较高的执行效率之外,有时还可以简化程序的结构。在Linux操作系统的内核代码中,我们可以看到大量的goto语句。当前最流行的手机操作系统之一的Android,基于Linux内核。