「goto」 语句语法
可能饱受诟病的「goto」 语句,让很多人闻风丧胆,也可能听过但完全不记得怎么写。实际上语法非常简单。goto
关键字后面添加 待跳转的标签
。它的作用是允许把控制无条件转移到同一函数内的被标签语句。
比如以下程序片段:
for (int i = 1; i <= n; i++) {
if (i == n - 1) goto done;
}
cout << "1\n";
done:
cout << "done.";
当程序执行 for
循环
i
=
n
−
1
i=n-1
i=n−1 时,程序执行权会被跳转至 done:
该行继续执行。以上代码输出内容为:
done.
并不会输出一行数字 1
。
「goto」 语句是禁术?
相信许多小伙伴们,听老师、同学、同事等,说要抵制使用「goto」 语句类似的话,之后就好像真的把「goto」 语句封杀了,一次也不会去用。究其原因是因为网络上、书籍上有这样一句话:
注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。
确实啊,它会使得程序的控制流难以追踪,比如以下程序片段:
back:
for (int i = 1; i <= n; i++) {
cout << "number: " << i << "\n";
}
goto back;
这里标签写在前面,那么跳转回去后又会执行循环,因此程序会在这里无限循环,这才是出问题的地方,滥用了「goto」 语句,试想一下代码长了,像这样的向前跳转,是最容易出现逻辑错误,且还不容易找到。但这不影响「goto」 语句发挥属于它自己的高光呀!
况且书上说的是不建议使用「goto」 语句,没有说禁止使用「goto」 语句吧?
比如在退出深嵌套:
for(...) {
for(...) {
while(...) {
if(...) goto stop;
.
.
.
}
}
}
stop:
cout << "ok.\n";
消除「goto」 语句会导致一些额外的数据被执行。一个简单的「break」 语句在这里不会起到作用,因为它只会使程序退出最内层循环。是,你可以添加多个「break」 语句而不需要使用「goto」 语句的写法,如果在六层循环或更多循环下,需要添加对应的循环次数的代码,一方面代码不美观,另一方面写起来费时费力且容易出错。
结语
「goto」 语句并不是像平常大家所说的那么狼狈不堪,它也有它的作用,用得好锦上添花,滥用则搬起石头砸自己的脚,希望读者能够以平常心对待「goto」 语句,仅仅使用跳出深循环也是一种明智之选。
——它并不是什么“罪不可恕之物”,它只是希望能有更多人懂它罢了……