简论 C++「goto」 语句是好是坏?

本文探讨了goto语句的语法和常见误解,指出虽然它可能导致控制流难以跟踪,但在特定情况下如深嵌套循环中,合理使用goto可以避免额外数据执行。作者强调应以平常心看待goto,用它来解决特定问题而非滥用。
摘要由CSDN通过智能技术生成

「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=n1 时,程序执行权会被跳转至 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」 语句,仅仅使用跳出深循环也是一种明智之选。

——它并不是什么“罪不可恕之物”,它只是希望能有更多人懂它罢了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值