答案 0 :(得分:80)
我认为应该更多地使用continue!
我常常遇到像:
这样的代码for (...)
{
if (!cond1)
{
if (!cond2)
{
... highly indented lines ...
}
}
}
而不是
for (...)
{
if (cond1 || cond2)
{
continue;
}
...
}
使用它来使代码更具可读性!
答案 1 :(得分:23)
continue
是否比 break
更有害?
如果有的话,在我遇到/使用它的大多数情况下,我发现它使代码更清晰,更少意大利面条。
答案 2 :(得分:12)
无论是否继续,您都可以编写好的代码,无论是否继续,您都可以编写错误的代码。
关于goto的参数可能有一些重叠,但就我而言,使用continue相当于使用break语句(在循环中)或从方法体中的任何位置返回语句 - 如果正确使用它可以简化代码(不太可能包含错误,更容易维护)。
答案 3 :(得分:7)
没有有害的关键字。只有它们的有害用途。
Goto本身并无害处,也不会继续。他们需要谨慎使用,就是这样。
答案 4 :(得分:5)
如果继续导致可读性问题,那么您可能还有其他问题。例如,for循环中的大量代码。如果你必须编写大的for循环,我会尝试坚持使用继续接近for循环的顶部。否则,很容易错过深埋在for循环中间的继续。
答案 5 :(得分:4)
我喜欢在循环开始时使用continue来处理简单的if条件。
对我来说,它使代码更具可读性,因为没有额外的嵌套,你可以看到我已经明确处理了这些情况。
这与我使用goto的原因相同吗?也许。我有时会将它们用于可读性并停止代码嵌套,但我通常更多地使用它们来进行清理/错误处理。
答案 6 :(得分:3)
我会说:“这取决于”。
如果你有相当小的循环代码(你可以在不滚动的情况下看到整个循环代码),通常可以使用continue。
但是,如果循环体很大(例如由于大的开关),并且有一些后续代码(比如在交换机下面),你可以通过添加一个继续来轻松引入错误,从而有时会跳过该代码。我在字节码解释器的核心遇到过这种情况,其中某些检测代码有时由于某些case分支中的继续而未执行。
这可能是一个有点人为构造的案例,但我通常会尽量避免继续并使用if(但不要像Rob的示例代码那样嵌套太深)。
答案 7 :(得分:2)
我不认为继续可能会像goto一样困难,因为继续从未将执行从其所在的代码块中移出。
答案 8 :(得分:2)
如果您正在迭代任何类型的结果集,并对所述结果执行操作,例如对于每个结果集,并且如果一个特定结果导致问题,则它在捕获预期错误时非常有用(通过尝试 - catch),记录它,然后继续前进到下一个结果。对于在奇数时间执行作业的无人值守服务,继续特别有用,imo,一个例外不应影响其他x个记录。
答案 9 :(得分:2)
在循环开始时使用continue来避免迭代不必要的元素是无害的并且非常有用,但是在嵌套ifs和elses的中间使用它可以将循环代码转换为复杂的迷宫,理解和验证。
我认为它的使用避免也是语义误解的结果。那些从未在代码中看到/写'continue'关键字的人,当看到带有continue的代码时,可以将其解释为“自然流程的延续”。例如,如果不是继续我们下一个,我认为会有更多人欣赏这个有价值的光标功能。
答案 10 :(得分:1)
goto可以用作继续,但不能反过来。
你可以在任何地方“转到”,从而任意打破流量控制。
因此继续,不会那么有害。
答案 11 :(得分:1)
其他人已经暗示过......但是编译器强制执行继续和中断,并拥有自己的关联规则。 Goto没有这样的限制,但在某些情况下,的净效果可能几乎相同。
我不认为继续或休息本身是有害的,虽然我确信要么可以使用任何一个让任何理智的程序员堵塞的方式。
答案 12 :(得分:1)
我会说是的。对我而言,它只是打破了流畅的代码片段的“流程”。
另一个论点也可能是,如果您坚持使用大多数现代语言支持的基本关键字,那么您的程序流程(如果不是逻辑或代码)可以移植到任何其他语言。拥有不受支持的关键字(即,继续或转到)会打破这一点。
这实际上更多的是个人偏好,但我从来没有使用它,并且在我编写新代码时并不认为它是一个选项。 (和goto一样。)
答案 13 :(得分:1)
就这个程序员而言,嵌套if / else 被认为是有害的。
答案 14 :(得分:0)
在大多数语言中,Continue是一个非常有用的函数,因为它允许在某些条件下跳过代码块。
一种替代方法是在if语句中使用布尔变量,但每次使用后都需要重置这些变量。
答案 15 :(得分:0)
对我来说继续感觉不对。休息让你离开那里,但继续似乎只是意大利面。
另一方面,您可以模拟继续中断(至少在Java中)。
for (String str : strs) contLp: {
...
continue contLp;
...
}
继续在某些情况下可能有用,但它对我来说仍然感觉很脏。
for (char c : cs) {
final int i;
if ('0' <= c && c <= '9') {
i = c - '0';
} else if ('a' <= c && c <= 'z') {
i = c - 'a' + 10;
} else {
continue;
}
... use i ...
}
答案 16 :(得分:0)
我认为反对继续的底线论点是,它使得更难以证明代码是正确的。这在数学意义上得到证明。但它可能对你没关系,因为没有人有资源“证明”一个非常复杂的计算机程序。
输入静态分析工具。你可能会让事情变得更难......
而goto,听起来像是一场噩梦,出于同样的原因,但在代码中的任何随机位置。