3.8 goto 语句与标号
C 语言提供了可随意滥用的 goto
语句以及标记跳转位置的标号
从理论上讲,goto
语句是没有必要的,实践中不使用 goto
语句也可以很容易地写出代码
但是,在某些场合下 goto
语句还是用得着的
最常见的用法是终止程序在某些深度嵌套的结构中的处理过程,例如一次跳出两层或多层循环
这种情况下使用 break
语句是不能达到目的的,它只能从最内层循环退出到上一级的循环
下面是使用 goto
语句的一个例子:
for ( ... )
for ( ... ) {
...
if (disaster)
goto error;
}
...
error:
/* clean up the mess */
在该例子中,如果错误处理代码很重要,并且错误可能出现在多个地方,使用 goto
语句将会比较方便
标号的命名同变量命名的形式相同,标号的后面要紧跟一个冒号
标号可以位于对应的 goto
语句所在函数的任何语句的前面
标号的作用域是整个函数
考虑判定两个数组 a
与 b
中是否具有相同元素的问题
一种可能的解决方法是:
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
if (a[i] == b[j])
goto found;
/* didn't find any common element */
...
found:
/* got one: a[i] == b[j] */
...
所有使用了 goto
语句的程序代码都能改写成不带 goto
语句的程序,但可能会增加一些额外的重复测试或变量
例如,可将上面判定是否具有相同数组元素的程序段改写成下列形式:
found = 0;
for (i = 0; i < n && !found; i++)
for (j = 0; j < m && !found; j++)
if (a[i] == b[j])
found = 1;
if (found)
/* got one: a[i-1] == b[j-1] */
...
else
/* didn't find any common element */
...
大多数情况下,使用 goto
语句的程序段比不使用 goto
语句的程序段要难以理解和维护
少数情况除外,比如我们前面所举的几个例子
尽管该问题并不太严重,但我们还是建议尽可能少地使用 goto
语句