使用"break"打破"for"循环被认为是有害的?

Jos*_*ino 22 c++ loops for-loop goto break

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

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

你怎么看?我看到在使用没有问题break一个内for循环.在我看来,模拟break使用布尔变量或类似的东西的行为增加了许多不必要的开销,并使代码不那么简单.

而且,没有比较的余地goto,因为break不能随意改变程序的流程从一个点到另一个谎言goto.

fir*_*gle 45

我觉得使用休息没问题.总是存在你想要停止处理循环的情况,并且使用一个break;更有意义(并使其更具可读性!),而不是将循环计数器设置为一个值,使得循环在下一次迭代时停止.

  • 我发现使用goto没有任何问题.在某些情况下,您希望停止处理非常嵌套的循环,并使用goto; 更有意义(并使其更具可读性!)比使用布尔值告诉您何时退出循环更有意义. (8认同)

Mat*_*hen 41

强制性:

XKCD转到

关键是你不应该纯粹基于不良做法(或速度赛)来避免它,而是根据具体情况考虑.

这都是关于清晰度的.正如你所说,你永远不必使用它,但在某些情况下它会提高可读性.当循环通常正常终止时它很有用,但在极少数情况下你必须摆脱困境.通常(或总是)破坏的循环更多的是代码气味(但仍然可能是合适的).

  • +1为这个漫画提供了一个很好的答案.我记得看到一个响亮的回答是这个漫画,没有别的,呃. (11认同)

Tha*_*tos 21

使用不仅没有问题break,我会说有人说它被认为是"有害的"是彻头彻尾的错误.

break是一种语言功能,用于中止循环 - 你可以使用goto,但随后你会产生下面XKCD漫画的(适当的)愤怒.您可以在条件中使用标志,但这会妨碍可读性.break不仅是最简单的,而且也是最常见的方式来摆脱循环.使用它本来就是用来使用它.


编辑:在这里进一步了解:当你编写代码时,"我应该使用X或Y语言特征"的指导原则应该是"哪种方式会产生更优雅的代码"?在代码中,优雅几乎是一门艺术,但我将它放在可读性和算法(读取:不是微优化)效率之间的平衡.可读性将由长度,代码的复杂性等决定.单行boost :: bind可能比3行循环更难阅读和理解.

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


Cog*_*eel 12

不仅没有问题break,还可以gotobreak不足时使用.不要害怕多重回报.

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

*如果你的PHB允许它......


Sco*_*ord 8

我认为你的伴侣很疯狂. break完全可以接受,完全可读,并且完美可维护.期.