前几天我开始了一个快速的开源项目,当有些伙伴查看svn上的代码时,其中一个人告诉我在break
循环中使用for
语句被认为是有害的不应该这样做。
但他补充说,我会在Linux内核源代码的break
循环中找到几个for
语句,但这只是因为只有Linus Torvalds和Chuck Norris被允许使用它而且没有其他人。
break
循环中使用for
没有问题。在我看来,使用布尔变量或类似的东西模拟break
的行为会增加很多不必要的开销,并使代码不那么简单。
此外,没有与goto
进行比较的余地,因为break
无法随意将程序的流量从一个点改为另一个谎言goto
。
答案 0 :(得分:45)
我认为使用休息没有问题。总是存在你想要停止处理循环的情况,并且使用break;
比将循环计数器设置为使循环停止的值更有意义(并使其更具可读性!)下一次迭代。
答案 1 :(得分:41)
强制性:
关键是你不应该纯粹基于不良做法(或快速变速器)来避免它,而是根据具体情况考虑。
一切都与清晰度有关。正如你所说,你永远不必使用它,但在某些情况下它会提高可读性。当循环通常正常终止时它很有用,但在极少数情况下你必须摆脱困境。通常(或总是)破坏的循环更多的是代码气味(但仍然可能是合适的)。
答案 2 :(得分:21)
使用break
不仅没有问题,我会说有人说这被认为是“有害的”是彻头彻尾的错误。
break
是用于中止循环的语言功能 - 您可以使用goto
,但随后您会产生下面XKCD漫画的(适当的)愤怒。您可以在条件中使用标志,但这会妨碍可读性。 break
不仅是最简单的,也是最常见的方式,可以多次摆脱循环。按照意图使用它。
编辑:为了更深入地了解这里:当你编写代码时,“我应该使用语言特征X或Y”的指导原则应该是“哪种方式会导致更优雅的代码“?在代码中,优雅几乎是一门艺术,但我将它放在可读性和算法(读取:不是微优化)效率之间的平衡。可读性将取决于代码的长度,复杂性等。单行boost :: bind可能更难以阅读&理解比3线循环。
如果语言功能可以帮助您编写在完成工作时更容易理解的代码,那么请使用它。这适用于break
,goto
,C ++例外等。不要盲目跟随“X是(邪恶|被认为有害)” - 每次都应用常识和逻辑。
答案 3 :(得分:12)
答案 4 :(得分:8)
我认为你的伴侣很疯狂。 break
完全可以接受,完全可读,并且完全可维护。周期。
答案 5 :(得分:2)
有一个范例,任何循环应该只有一个退出点(与函数相同应该只有一个返回)。这与可读性有关。退出点太多会使代码难以理解。此外,如果您想要进行代码验证(例如,如果您的代码是正确的,则数学证明)非常重要。
但是,指南往往有所帮助,但并不严格。在某种情况下,休息比不使用休息更好。因此,人们应该务必这样做,但要理解这些原则的原因,以便创造出良好的代码。
答案 6 :(得分:1)
我认为这取决于背景。虽然在某些情况下它可能是“糟糕”的编码风格,但我不能想到它会有害的情况。
事实上,在某些情况下我会推荐它。例如,如果您使用线性搜索,任何情况(最坏的情况除外),我认为当您使用时会突破循环发现你的针头是完全可以接受的,并且它比使用循环变量(可能不仅仅用于循环,取决于你的程序)或将循环体包裹在break
会提高您的速度。if
块中更具可读性。 (另一个选项,包含if
的{{1}},结合了两个世界中最糟糕的一个:在continue
块中包装循环逻辑,而像你这样的人抨击糟糕的编码风格不喜欢if
的朋友。)
答案 7 :(得分:1)
增加循环计数器而不是使用break也意味着你完成了循环的当前迭代,这可能是也可能不是。
if子句中,然后在您意识到需要检查是否要多次停止循环时再次执行此操作,并且您将很快意识到为什么人们使用{{ 1}}
答案 8 :(得分:1)
如果您正在考虑使用给定的技术,我建议使用此算法。
我会将break;
归类为“不良做法”。在使代码更具可读性,减少错误的可能性,不会使调试复杂化等时使用它。