最近,我一直在查看各种 C++ 代码示例,其中包含以下内容:
//líneas de código
for (i = 0; i < n; i++)
{
if((alguna_condición))
{
//más código
break;
}
}
//siguen más líneas de código
在我的 C++ 类中,我只使用了break
带有条件结构的语句,所以我对使用带有重复结构的语句switch
感到有点惊讶。在谷歌中搜索我发现了以下链接,但是我唯一得到的就是让我感到困惑。从我读到的内容来看,对某些人来说使用没有什么问题,但对另一些人来说,它与使用臭名昭著的.break
for
break
goto
基本上我的问题,正如标题所暗示的那样,是否可以在重复控制结构中使用,如果不是,它是否与使用?break
一样“有害” 。goto
提前感谢您的评论和/或答案。
这是完全有效的;这是你的任务,摆脱当前的代码块;更具体地说,它的使用仅限于块:
switch
do
while
for
退出块
if
(不包含在任何先前的块中)是无效的:也不适用于匿名范围(同样不包含在任何有效块中):
它也不允许退出嵌套块:
在该示例中,
break
退出最里面的块;即它只适用于它包含在.使用
break
与使用任何其他 C++ 实用程序一样糟糕:没什么不好。邪恶不在于使用的效用,而在于给予它的用途。正如您所指出的,它通常用于改变循环的自然流程,例如通过迭代集合直到找到特定元素:Ejemplo1
前面的代码没有任何问题:它通过对象集合 (
principes
) 对其执行测试 (es_azul
),在循环结束时,变量indice
包含满足所述条件的第一个对象的索引,或者principes.size()
如果没有任何; 上面的代码几乎等同于:Ejemplo2
关于这两个版本哪个更好可能会有激烈的争论,但总的来说,这些讨论不会关注指令的使用,
break
而是指令的数量(循环Ejemplo2
需要多转一圈)或清晰度(Ejemplo1
可能更难理解) ). .无论如何,您在现代 C++ 中几乎看不到
Ejemplo1
它Ejemplo2
,因为通常将这种类型的操作委托给标头<algorithm>
:每个编译器都会
std::find_if
以<algorithm>
自己的方式实现它,但通常实现可能如下所示:return first;
循环内的指令的工作方式与break
您在示例中的指令类似:它们改变了循环的自然流程,您可以看到它在标准库代码中使用,没有什么可反对的,对吧?我将成为不和谐的声音:虽然
break
(和continue
,另一个经常落入同一个包的操作break
)在技术上是有效的,可以用来突破条件/迭代结构,如果可以避免,它应该' t 用于高级编程(有一些例外)。关键部分:“如果可以避免”。它没有那么糟糕(或者我应该说有害吗?),因为当你执行 a (在包含它的块的末尾)
goto
时,你确切地知道你要去哪里,但是这样你就打破了正常的流程break
结构也不是。 是理想的,使代码的可读性降低(尽管这是有争议的),并可能导致意想不到的结果。例如,如果您正在查看以下代码并到达 的标题
for
,您会期望当循环结束时,的值x
大于或等于 100。这不会发生,因为下面有 N 行一个break
:真正的问题来了,因为人们没有很好地使用它们并滥用它们。例如,在上面
break
循环内部有 a 的情况下for
,真正发生的是没有选择正确的结构:可以避免break
将代码重构为循环while
或 ado...while
:另一个问题
break
,正如 Trauma 所指出的,如果你有两个嵌套的迭代结构,其中只有内部的一个要退出,但如果我们想同时退出这两个呢?我们再做一次break
好吗?我们再检查一遍好吗?在这种情况下,也许使用哨兵变量会更好,例如。简而言之:只要
break
它们continue
在技术上是有效的(在某些情况下甚至是必要的)并且可以在干净整洁的代码中完美运行......但情况并非总是如此,它们的使用(或滥用)可能会导致问题和不良做法。