我最近在一本书中读到过使用break
声明,例如for
循环被认为是不优雅的(虽然它被广泛接受用于switch
语句)。
这种“指责”的原因是什么?
我应该在break
循环中使用for
语句,还是应该使用多个条件?
答案 0 :(得分:7)
你将不得不问这本书的作者(哪个书?),因为我今天的ESP正在讨论 [citation needed] < / SUP>
有时 [when?] 据说,如果你在整个代码体中写了很多break
语句,那么就不再容易看到循环不变量和控制流,而不执行详细的程序分析。
但是,实际上,条件块中的一些break
语句不会伤害任何人,并且使循环条件复杂化,IMO,更容易出现going horribly wrong。
答案 1 :(得分:1)
理由是,在一个地方继续或退出循环而不是分散在整个循环体中的条件更清楚。
答案 2 :(得分:1)
这就像那些说goto
因为一篇关于60年代这个主题的文章所写的那样糟糕的人。如果大量使用,我会同意。但是,例如,在C函数中,使用try
和catch
没有C ++异常处理的好处,故意和有意使用goto
可能非常有用。如果使用malloc()
分配内存的函数返回错误,则创建一个自包含的清理部分。如果没有goto
语句,则必须在检测到错误的每个if
语句的末尾放置清理代码。例如,你看起来更好......这个:
int my_func()
{
int* a = malloc(10);
//... some code
if (some_error)
{
free(a);
return -1;
}
//... more code
if (some_other_error)
{
free(a);
return -1;
}
//... more code
if (another_error)
{
free(a);
return -1;
}
//... more code
free(a);
return 0;
}
或代码如下:
void my_func()
{
int* a = malloc(10);
//... some code
if (some_error)
goto return_error;
//... more code
if (some_other_error)
goto return_error;
//... more code
if (another_error)
goto return_error;
//... more code
normal_return:
free(a);
return 0;
return_error:
free(a);
return -1;
}
使用第一个示例,每次更改内容时,都必须管理每个if语句块中的所有错误返回。后一种方法为您提供了一个很好的独立清理部分。所以对于语法的其他任意规则也是如此,例如“不要在循环中使用break
”......如果它有助于提高代码的可维护性,可靠性和可读性,那么一定要使用它。
答案 3 :(得分:0)
这是一种风格问题 会有人说它打破了循环的流程(就像你不应该在方法中使用多个return语句)。
但break
非常富有表现力。正确放置的断点比包含我们应该停止循环的状态(而不是断点)的循环条件更具可读性和可维护性。
答案 4 :(得分:0)
我不确定它是否有帮助,但是,JoaquínMLópezMuñoz在他的博客中解决了这个问题: http://bannalia.blogspot.com/2009/03/about-break-statements.html
此致 &安培; rzej