如果“flag”为真,我必须执行步骤号。 1否则跳过它。有没有办法在循环中跳过这种不必要的重复检查。 (因为执行循环时flag的值没有改变)
private void method(boolean flag) {
while (man > woman) {
if (flag) {
// Step no. 1
System.out.println(flag);
}
}
}
答案 0 :(得分:10)
我不确定在这个级别担心优化是否有效。通常,让程序运行并继续处理下一个问题更为重要。
话虽如此,有一个名为 loop unswitching 的优化,有些编译器会为你做。它们复制循环,一次使用,一次没有条件,并向外移动条件以选择循环。 (在你的例子中,你可以使整个循环成为条件,但我认为这只是Stack Overflow简化的一个工件。)
但这只是不要过于担心优化的另一个原因,至少,直到你有一个配置文件并且你知道这个代码区域负责可检测的运行时数。
尽管如此,最好尽可能干净地编写代码,并且通过这样的问题解决这些问题会教你很好的事情......
事实上, 循环不变条件 也让我烦恼。我不相信有一个普遍的答案。有一些奇特的答案涉及更高阶函数或lambdas,“留下编译器”的答案,重构 - 整个外部例程的答案......我通常会赞同使代码看起来更小的任何东西。你必须优先考虑以区别对待......
答案 1 :(得分:0)
这取决于do
的范围。如果do
始终为true,则无需检查它,您可以删除if (do)
。如果变量始终为真,则没有理由将变量设置为true。范围是什么?
答案 2 :(得分:0)
如果的值在循环中随时更改,则必须每次检查,除非您重写代码以便执行== true 状态是在当前循环之外处理的(可能是在一个较小的循环中;它取决于你正在尝试做什么[没有双关语意图])。
答案 3 :(得分:0)
while (man > woman) {
请注意这里的无限循环: - )