【问题标题】:Optimization for: while (true)优化:while (true)
【发布时间】:2019-09-27 06:24:27
【问题描述】:

我正在使用一个

while (true)
{
    if (x == y)
    {
        break;
    }
    else
    {
        //do stuff
    }
}

像这样循环,框架只是一个示例框架,因为实际代码本身很复杂而且过于复杂,需要“中断”;针对多个不同条件在多个不同区域中声明。 我的问题是;有没有办法编写一个循环语句而不用循环检查条件?除了while(true)还有没有更高效的写死循环的方法?

编辑:(java)

编辑2:

while (a < b)
{
    while (true)
    {
        if (c < d)
        {
            if (e == null)
            {
                //do alot of stuff
                break;
            }
            else
            {
                //do something
            }
        }
        else if (d > c)
        {
            if (e == null)
            {
                //do alot of stuff
                break;
            }
            else
            {
                //do something
            }
        }
        else if (d == c)
        {
            break;
        }
    }
    a = a + 1;
}

【问题讨论】:

  • 视实际情况而定。您给出的示例很容易简化为while (x != y) {// do stuff}。但我认为,你的真实情况更复杂。
  • 我会在评论编辑中发布实际情况。
  • 如果里面有很多代码,外循环的效率就无关紧要了。在break 之后不需要else,因此你不需要else 控制的代码在{} 内并缩进。你也不需要在拥有之后测试d == c已经测试过d &lt; cd &gt; c。仅关注这类事情就会大大简化代码的外观。

标签: java loops while-loop break infinite


【解决方案1】:

有没有办法编写一个循环语句而不用循环检查条件?除了while(true)还有没有更高效的写死循环的方法?

您可以通过多种方式编写无限循环,但它们都是等价的。两者都没有真正比其他更有效:

  1. while (true) { ... }
  2. do { ... } while (true);
  3. for (;;) { ... }

根据实际代码,将“break-loop-logic”反转为“continue-loop-logic”可能是有意义的,如下:

boolean continueLoop;
do {
    continueLoop = false;

    // ... do stuff ...

    if ( some condition ) {
        continueLoop = true;
    }

    // ... do stuff ...

} while (continueLoop);

【讨论】:

    【解决方案2】:

    对于您的特定示例,您可以将中断if 语句的逻辑移至while 条件:

    while (x != y) {
        // do stuff
    }
    

    事实上,如果您原来的 while 循环有多个中断条件,您也许可以将它们全部移至 while 条件,例如

    while (!cond1 && !cond2 ... ) {
        // execute
    }
    

    【讨论】:

    • 虽然第二个示例可能有效,但我经常发现在这种情况下,cond{i} 的值会在循环体执行期间发生变化,通常是在评估它们以触发中断之前。
    • @schwobaseggl 我当然是在推测,因为我们不知道 OP 的实际代码(当我们发现它要复杂得多时做好准备)。不过我同意你的评论。
    【解决方案3】:

    是的,有很多方法可以做到这一点。例如,您可以在循环外声明一个变量,根据变量值设置条件并在循环内重置该变量,因此循环将无限运行而无需检查内部条件。

    阅读此示例:- https://en.wikipedia.org/wiki/Infinite_loop

    【讨论】:

    • for(;;) 是我在 wiki 中找到的有用的东西
    • @Saharsh while (true)for (;;) 之间没有实际区别。
    • 既然你提到了它,我回到 wiki 并意识到评论是如何说它相当于 while(1)
    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多