### goto 语句

goto 语句能够在函数内部实现无条件跳转，因此，它也被称为无条件跳转语句。goto 语句的语法格式为：

goto 标号;

其中，标号是用户自定义的一个标识符，以冒号结束。利用 goto 语句可以实现循环语句的功能。例如，下面的代码使用 goto 语句实现 1…100 的累加求和运算。

使用 goto 语句实现累加求和

int main(int argc, char* argv[])

{

int i = 1 ; //定义一个整型变量，初始化为 1

int nSum = 0; //定义一个整型变量，初始化为 0

label: //定义一个标签

nSum += i; //累加求和

i++;

if (i < 101) //判断 i 是否小于 101

{

goto label; //转向标签

}

cout << "结果为: " << nSum << endl;

return 0;

}

运行程序，效果如图 1 所示。

图 1 goto 语句应用

上述代码中，利用标签实现了原始的循环功能。当语句执行到“if (ivar <100)”时，如果条件为真，则不停地转到标签定义处。这是一种古老的跳转语句，它会使程序的执行顺序变得混乱，CPU 需要不停地进行跳转，效率比较低，因此，在开发程序时尽量不使用 goto 语句。

在使用 goto 语句，应注意标签的定义。在定义标签时，其后不能紧接着出现“}”符号。例如，下面的代码是非法的。

int i = 1 ; //定义一个整型变量，初始化为 1

int nSum = 0; //定义一个整型变量，初始化为 0

{

//其他操作

label: //定义一个标签

}

在上述代码中，定义标签时，其后没有执行代码了，所以出现编译错误。如果程序中出现上述情况，可以在标签后添加一个空语句，以解决编译错误。例如：

int i = 1 ; //定义一个整型变量，初始化为 1

int nSum = 0; //定义一个整型变量，初始化为 0

{

//其他操作

label: //定义一个标签

; //添加一个空语句，解决编译问题

}

在使用 goto 语句时还应注意 goto 语句不能越过复合语句之外的变量定义的语句。例如，下面的 goto 语句是非法的。

goto label; //跳转到标签

int i = 10; //声明一个变量，初始化为 10

label: //定义标签

cout << "goto 语句" << endl; //输出信息

在上述代码中 goto 语句试图越过变量 i 的定义，导致编译错误。解决上述问题的方法是将变量的声明放在复合语句中。例如下面的代码将是合法的。

goto label; //跳转到标签

{

int i = 10; //声明一个变量，初始化为 10

}

label: //定义标签

cout << "goto 语句" << endl; //输出信息

在嵌套的循环语句中，goto 语句可以直接跳出所有外层循环，如果使用 break 语句结束循环，需要在每一层循环中都使用 break 语句。这就好像是一幢大楼着火了，3 楼的人员无法通过走楼梯的形式一层一层下到一楼，走出大楼。为了保住生命，选择从 3 楼直接跳下。这样做很可能受伤，甚至骨断筋折，但是毕竟保住了生命。我们在程序中建议少用、慎用 goto 语句，但是并不是禁用 goto 语句，在特殊情况下可以使用 goto 语句。

注意：在高级程序设计语言中，很少使用goto语句，它存在许多缺点。