23

几天前我开始了一个快速的开源项目,当一些小伙伴在 svn 上查看代码时,其中一个告诉我,break在循环中使用语句for被认为是有害的,不应该这样做。

不过,他补充说,我会在 Linux 内核源代码的循环中找到几种break语句for,但这只是因为只有 Linus Torvalds 和 Chuck Norris 被允许使用它,而没有其他人被允许使用。

你怎么看?我认为在循环break内使用没有问题。for在我看来,模拟break使用布尔变量或类似变量的行为会增加很多不必要的开销,并使代码变得不那么简单。

另外,没有与 比较的余地goto,因为break不能随意改变程序的流程从一个点到另一个点goto

4

9 回答 9

45

我认为使用休息没有问题。在某些情况下,您希望停止处理循环,并且使用 abreak;比将循环计数器设置为使循环在下一次迭代中停止的值更有意义(并且使其更具可读性!)。

于 2010-07-10T01:28:49.470 回答
41

强制性:

XKCD转到

关键是你不应该仅仅因为不好的做法(或迅猛龙)而避免它,而是要根据具体情况考虑。

这一切都与清晰度有关。正如您所说,您永远不必使用它,但在某些情况下它可以提高可读性。当循环通常正常终止时它很有用,但在极少数情况下您必须退出。通常(或总是)中断的循环更像是代码气味(但仍然可能是合适的)。

于 2010-07-10T01:28:51.107 回答
22

不仅使用没有问题break,我想说任何说它“被认为有害”的人都是完全错误的。

break是一种用于中止循环的语言功能 - 您可以使用goto,但随后您会招致下面 XKCD 漫画的(适当的)愤怒。您可以在条件中使用标志,但这会妨碍可读性。break不仅是最简单的,而且是多次跳出循环的最清晰的方法。使用它,因为它应该被使用。


编辑:在这里获得更大的图景:当您编写代码时,“我应该使用语言功能 X 还是 Y”的指导原则应该是“哪种方式会产生更优雅的代码”?代码中的优雅几乎是一门艺术,但我认为它是可读性和算法(阅读:不是微优化)效率之间的良好平衡。可读性将取决于长度、代码的复杂性等。单行 boost::bind 可能比 3 行循环更难阅读和理解。

如果一种语言功能可以帮助您编写在完成工作时更易于理解的代码,那么请使用它。这适用于break, goto, C++ 异常等。不要盲目地遵循“X 是(邪恶的|被认为有害的)”——每次都应用常识和逻辑。

于 2010-07-10T01:32:12.347 回答
12

不仅没有问题,不足时break可以使用。gotobreak也不要害怕多次退货。

以上所有内容仅适用于使代码更易于理解的情况*。

*如果您的PHB允许...

于 2010-07-10T01:37:52.660 回答
8

我觉得你男朋友疯了 break是完全可以接受的、完全可读的和完全可维护的。时期。

于 2010-07-10T02:07:03.027 回答
3

有一种范式,任何循环都应该只有一个退出点(与函数应该只有一个返回相同)。这与可读性有关。太多的退出点会使代码很难理解。此外,如果您想进行代码验证(即,如果您的代码正确,则以数学方式证明)也很重要。

但是,指南通常可以提供帮助,但并不严格。在某些情况下,休息总比不使用要好。因此,对此应该务实,但要了解这些原则的原因,以便创建好的代码。

于 2010-07-10T01:34:12.293 回答
1

我认为这取决于上下文。虽然在某些情况下它可能是“糟糕”的编码风格,但我想不出它会有害的情况。

事实上,在某些情况下,我会推荐它。例如,如果您使用线性搜索,任何情况下(除了最坏的情况),abreak都会提高您的速度。我认为当你发现你的针时打破循环是完全可以接受的,而且它比弄乱循环变量(它可能不仅仅用于循环,取决于你的程序)或包装更具可读性块中的循环体if。(另一个选项,if其中包含continue,结合了两个世界中最糟糕的情况:将循环逻辑包装在一个if块中,以及像你的朋友这样不喜欢的人所反对的糟糕的编码风格break。)

于 2010-07-10T01:31:04.517 回答
1

增加循环计数器而不是使用 break 也意味着您完成了循环的当前迭代,这可能是可取的,也可能不是可取的。
当然,你可以把剩下的部分包在一个if子句中,当你意识到需要多次检查是否停止循环时再做一次,你很快就会明白为什么人们使用break;

于 2010-07-10T01:35:42.337 回答
1

如果您正在考虑使用给定的技术,我建议使用此算法。

  • 如果它被认为是好的做法
    • 用它。
  • 如果它被认为是好的做法:
    • 仅当您认为它是最佳的长期解决方案时才使用它。
  • 如果它被认为是邪恶的:
    • 仅当您认为它是最佳的长期解决方案并且您对自己的判断非常有信心时才使用它。当心:被认为是邪恶的东西往往具有欺骗性的吸引力。

我会归类break;为“不好的做法”。当它使代码更具可读性,减少错误的机会,不使调试复杂等时使用它。

于 2010-07-10T01:52:02.253 回答