摘要:C 语言中的 goto 语句允许程序把控制无条件转移到同一函数内的被标记的语句。
goto
goto语句又称为无条件转移语句,使用goto语句可以使CPU直接跳转到其label标注处执行程序。但是在多数的高级编程语言课程上都不提倡使用goto语句,原因是goto语句过于灵活,过度的使用可能会导致结构化设计程序的逻辑混乱以及降低代码可读性。但另一方面,常常会看到很多优秀的编程人员在使用goto语句,而且大名鼎鼎的Linux内核中有大量的goto语句,并且Linus本人也推荐合理的使用goto语句。注意,这里说的是合理的使用goto会大大简化代码,并且使程序逻辑更加清晰。
1 基本语法
goto label;
..
.
label: statement;
其中,label为我们自己定义的一个标签,定义的规则与变量的命名相同,它的位置是不固定的,它可以写在goto语句的后面,也可以写在它的前面,然而goto语句只能在一个函数内部跳转,它并不允许跳转出一个函数外部。
示例1
我们可以通过goto语句来实现一个类while语句的循环功能:
int day = 1;
loop:
if (day <= 31)
{
printf("%d\n", day);
day++;
goto loop;
}
上面程序就是利用了goto和if语句来实现了循环功能,它与while实现的循环功能一样,其中loop为我们定义的一个label(标签)。
示例2
接下来我们再来看一个关于goto语句合理使用的例子,在看这个例子之前我们先来看看一个在双循环中根据条件跳出的普通实现
int found = 0;
for (int i = 0; i < n && !found; i++)
{
for (j = 0; j < m && !found; j++)
{
if (a[i] == b[j])
{
found = 1;
}
}
}
if (found)
{
//do something
}
由于break;语句只能跳出当前循环,不能跳出多层嵌套循环之外,所以我们只能用found变量来做为循环嵌套中的结束条件。
现在我们可以使用goto来完成这个功能:
for (int i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (a[i] == b[j])
{
goto found;
}
}
}
found: // do something
可以看到使用了goto语句的程序明显比使用双循环通过条件跳出的简洁了。
补充总结:
- 合理地使用goto可以使程序更简洁,不合理地使用goto会破坏程序的结构,使程序逻辑混乱以及可读性降低。
- goto可以用来跳出多重循环
- goto语句只能在一个函数内部跳转,它并不允许跳转出一个函数外部。标签的位置是不固定的,可以写在goto语句的后面,也可以写在它的前面。
参考链接
https://blog.csdn.net/walle2018/article/details/79607060
https://www.askpure.com/course_TGESH6E1-XRQR2I14-9XPX7Q53-KDBES2UV.html
https://www.runoob.com/cprogramming/c-goto-statement.html
http://c.biancheng.net/view/266.html