优化:while (true)

5

我正在使用一个

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

循环像这样,框架只是一个示例框架,实际代码本身很复杂,需要在多个不同区域和多个不同条件下使用“break;”语句。我的问题是:有没有一种方式可以编写循环语句而无需检查条件?是否有更有效的方法编写无限循环,而不仅仅是使用while(true)?(Java)
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;
}

2
那取决于实际情况。你给出的例子可以简化为 while (x != y) {// do stuff}。但我猜想,你的真实情况更加复杂。 - user2390182
我会在评论编辑中发布实际情况。 - Sam Thompson
如果循环内有大量代码,外部循环的效率几乎不重要。在break之后不需要else,因此您不需要由{}控制的代码缩进。您也不需要在已经测试了d < cd > c之后再测试d == c。仅关注这种事情就可以显着简化代码的外观。 - user207421
3个回答

1
有没有一种方式可以编写循环语句,而不需要循环条件检查呢?有没有比 while(true) 更有效的无限循环写法?
你可以用多种方法编写无限循环,它们都是等效的。其中一种并没有比其他两种更高效:
1. while (true) { ... } 2. do { ... } while (true); 3. for (;;) { ... }
根据实际代码,有时候将“跳出循环逻辑”反转为“继续循环逻辑”可能会更有意义。例如:
boolean continueLoop;
do {
    continueLoop = false;

    // ... do stuff ...

    if ( some condition ) {
        continueLoop = true;
    }

    // ... do stuff ...

} while (continueLoop);

0

对于你的特定示例,你可以将打破逻辑从 if 语句移动到 while 条件中:

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

事实上,如果您的原始while循环有多个中断条件,您可能能够将它们全部移动到while条件中,例如。
while (!cond1 && !cond2 ... ) {
    // execute
}

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

0

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

阅读以下示例: https://en.wikipedia.org/wiki/Infinite_loop


for(;;)是我在维基百科中发现的一些有用的内容。 - Saharsh
@Saharsh,“while (true)”和“for (;;)”之间没有实际区别。 - user207421
既然你提到了,我回到维基百科上看到评论说它等同于 while(1) - Saharsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接