3

如果“标志”为真,我必须执行步骤号。1 否则跳过它。有没有办法在循环中跳过这种不必要的重复检查。(因为标志的值在循环执行时没有改变)

private void method(boolean flag) {
        while (man > woman) {
            if (flag) {
                // Step no. 1
                System.out.println(flag);
            }
        }
    }
4

4 回答 4

10

我不确定在这个级别上担心优化是否有效。通常更重要的是让程序运行并继续处理下一个问题。

话虽如此,有些编译器会为您执行一种称为循环取消切换的优化。他们复制循环,一次有条件,一次没有条件,然后将条件向外移动以选择循环。(在您的示例中,您可以使整个循环成为有条件的,但我认为这只是 Stack Overflow 简化的产物。)

但这只是另一个不必过多担心优化的理由,至少在您拥有配置文件并且您知道该代码区域负责可检测的运行时量之前是这样。

尽管如此,最好尽可能干净地编写代码,并且通过这样的问题令人费解会教你一些好东西......

事实上,循环不变条件也困扰着我。我不相信有一个普遍的答案。有涉及高阶函数或 lambdas 的奇特答案、“留给编译器”的答案、重构整个外部例程的答案……我通常会赞成任何使代码看起来更小的方法。您必须优先考虑才能区分...

于 2009-11-15T20:29:05.080 回答
0

这取决于do. 如果do始终为真,则无需检查它,您可以删除if (do). 如果变量始终为真,则没有理由将其设置为真。范围是什么?

于 2009-11-15T20:23:41.103 回答
0

如果do的值在循环中的任何时候发生变化,您必须每次都检查它,除非您重写代码以便在当前循环之外处理do == true状态(可能在较小的循环中;它取决于你想要做什么[没有双关语])。

于 2009-11-15T20:26:34.023 回答
0
while (man > woman) {

当心这里的无限循环:-)

于 2009-11-15T20:55:49.340 回答