我正在为CS类做一个基本Java项目。该项目有一个嵌套在while循环中的for循环。
我不允许使用break
作为提前结束for循环的方法。我发现return
似乎与break
具有相同的效果。使用return
作为打破循环的方法是不好的风格?
我的for循环必须检查三个不同的语句,但是如果它找到一个是真的那么它应该直接结束而不继续检查其余的语句。
我试图在while循环中放置一个布尔运算符来控制for循环但是这不会控制for循环内部的内容,直到for循环结束。
如果return
没有返回任何内容也很重要吗?
299/01/11 更新:非常感谢大家的评论。我发现阅读所有辩论确实很有帮助。
我和我的导师谈过,结果是为了得到满分,我也不应该使用return
。
所以我发现在'for'循环中设置布尔值的建议确实很有帮助,因为我不知道你能做到这一点。
答案 0 :(得分:15)
如果断开循环后的第一件事是return
语句,它们只是等价的。
在任何情况下,如果您的讲师不允许break
,他们可能也不允许return
。
你应该知道这些规则背后有很好的基础(防止意大利面条代码并且更容易编写可维护的代码)但有时它们会过于强烈地执行。
例如,
if (x == 0)
return 0;
return x - 1;
即使它有多个return
语句。
对于无多重回归人群而言,所谓的首选解决方案是:
int y = x - 1;
if (x == 0)
y = 0;
return y;
在我看来,这两者都不太可读,也浪费了空间。
当你拥有非常复杂的逻辑和人们跳过的箍以避免break
和/或return
导致条件接近不可读时,就会出现真正的问题。
听听你的讲师 - 毕竟,他们是控制你获得什么年级的人。然后,一旦你进入现实世界,你就可以从教条主义转向实用主义,并构成自己的想法。
请参阅here,了解有关教育机构以外的这些问题的一些好建议。
答案 1 :(得分:6)
首先,如果你明智地使用它,不使用break
是一种不好的风格。
虽然我理解你的教授为什么坚持不用break
进行编码(因为很多人,特别是初学者,往往'过度使用'),但没有理由禁止完全。< / p>
使用return作为打破循环的一种方式是不好的风格?
就个人而言,我认为你会没事的:代码只会变得更简单。但显然你的教授是这里的高级权威。整个问题非常主观,因此我无法告诉他。
但是,无论你的教授sais是什么,在循环中使用return
都是而不是一种糟糕的风格。
答案 2 :(得分:5)
这个问题似乎进入了一个非常古老的尚未解决的论点,即“单一与多方法退出点”。
因此,如果在循环中使用return让您(或您的老师)感到担忧,您(或他)可以看一眼here。
回答你的问题。 在我(而不仅仅是我的)意见中,使用循环返回绝对可以。
请注意,过度使用它可能会降低代码的可读性(有关详细信息/示例,请参阅链接的答案)。
答案 3 :(得分:3)
如果'返回'也很重要 不归还什么?
这取决于你的方法的返回类型。如果返回类型为void,则return子句必须为空:
return;
否则,return子句必须返回所需的类型,例如
return true; // legal for boolean return type
return null; // legal for all object types
return "Hello"; // legal if return type is String
答案 4 :(得分:3)
从纯粹的观点来看,不应该使用断裂。 while循环的要点是你使用循环开始时的条件来摆脱它,如果你开始用break语句填充你的循环而不是让条件正确(这是一个快速的黑客学生很可能会被诱惑使用,如果他们无法解决如何以正确的方式做事!)同样的事情继续并在循环中间返回。
所有这些语言功能都是有原因的,是的,有时它们是最好的做事方式。然而,当你刚开始时,你明智和正确地使用它们的机会很少,它们更有可能被用作免费的“黑客让我离开监狱而不了解这件事如何运作”卡片。而且,我认为,这是禁止他们在基础编程课程中使用的充分理由。
答案 5 :(得分:2)
break
和return
不一样。 break
将停止执行最内层循环,return
将从当前方法返回 - 即该方法中不再执行任何操作。据我所知,在循环中使用break没有任何问题;可能这是一个人为的要求,以便让你想到替代逻辑。使用return
也没有错;这将使你免于可怕的嵌套条件(if
条款)。
答案 6 :(得分:2)
如果您不允许使用break
,那么不使用return
也是有意义的,因为每个break
的循环都可以重写作为return
的循环(通过将其外包到一个单独的函数中)。
从非家庭作业的角度来看,break
(和return
)是非常有用的语言功能,通常不被视为不良风格(当然,每种语言)构造可以被滥用来编写错误的代码。)
然而,在你的家庭作业场景中,我想通过使用break
来解决缺少return
的问题将会破坏作业的重点。你应该想办法解决你的任务。
我试图在while循环中放置一个布尔运算符来控制for循环但是这不会控制for循环内部的内容,直到for循环结束。
这是真的,但是,通过使用if
语句,您还可以执行/不执行循环中的代码,具体取决于您的布尔值。
答案 7 :(得分:2)
你可以提前终止像这样的for循环
for (int i = 0; i < SOMELIMIT && (!found); ++i) {...}
答案 8 :(得分:2)
我想你的导师想要你在for循环的条件部分使用break条件。您需要在循环之前声明此条件并在循环内更改它。
boolean stop = false;
for (...; ... && !stop; ...) {
...
if (...) {
stop = true;
}
}
答案 9 :(得分:2)
这是关于完美的代码。
for(int i; i < stop; i++) {
boolean flag = true;
while(flag && condition) {
//some action
if(shouldIstop) {
flag = false;
}
}
}
当您将旗帜设置为false时,您将从while退出,当您将i设置为停止时,您也将退出。
答案 10 :(得分:1)
您将获得相同的结果,但代码质量和易读性将降低。