C goto语句与标号

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C goto语句与标号

C语言提供了可随意滥用的goto语句以及标记跳转位置的标号。从理论上讲,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语句。

相关文档
最新文档