使用“while(true){...}”是什么意思?

问题描述:

为什么有些人在他们的代码中使用while(true){}块?它是如何工作的?使用“while(true){...}”是什么意思?

+0

因为您希望有一个反复运行的任务,并且没有结束条件,除了程序结束之外。 – HoLyVieR 2010-10-16 00:26:40

+4

它被称为无限循环。也被称为加热器。 – jcolebrand 2010-10-16 00:29:19

+0

什么语言? (这个括号只是增加了足够的字符来使StackOverflow接受评论 - 他们有一个愚蠢的规则,即注释必须超过等号字符。) – 2010-10-16 00:29:40

这是一个无限循环。在每次迭代中,条件将被评估。由于条件是true,总是......真的......循环将永远运行。退出循环是通过检查循环内部的东西来完成的,然后在必要时打破。

通过在循环内部放置break检查,而不是将其用作条件,这可以让您更清楚地知道,您期待这种检查在发生某些事件之前运行。

这是一个常见的场景,在游戏中;你希望继续处理动作和渲染帧,直到游戏结束。

+0

哦,真的,我猜是的!谢谢。 – trusktr 2010-10-16 00:31:19

while(条件){做函数} 当条件为真..它会做的功能。

所以while(true) 条件总是为真 它会继续循环。

编码将永远不会进行。

+0

编码可能会继续,但不退出循环(比如使用'break'),处理将永远不会在循环之外继续。 – jcolebrand 2010-10-16 00:26:54

+0

我的意思是..如果他不使用任何关键字来打破循环,它将继续循环。 – william 2010-10-16 00:47:13

这只是一个永远不会结束的循环,被称为。 (很多时候,这是一件坏事。)

当它是空的时候,它会无限期地停止程序*;否则通常有一个在环路一些条件,真当,打破循环:

while (true) 
{ 
    // ... 

    if (stopLoop) 
     break; 

    // ... 
} 

这往往比辅助标志清洁:

bool run = true; 
while (run) 
{ 
    // ... 

    if (stopLoop) 
    { 
     run = false; 
     continue; // jump to top 
    } 

    // ... 
} 

还要注意一些会建议for (;;)相反,各种原因。 (也就是说,它可能会摆脱类似于“条件表达总是如此”的警告。)

*在大多数语言中。

+3

这不是一个“停止”,而是“迅速转换到位”。 – 2010-10-16 01:18:07

+0

@Jeremy:很好。 :)除非我将“halt”定义为“不会执行超出'while循环'范围的语句”,否则我会按原样离开我的帖子。 :P – GManNickG 2010-10-16 01:53:00

这是一个永久运行的循环,除非在身体内部有一个break声明。

不是东西在while语句中的所有可能的条件下,

// Always tests all conditions in loop header: 
while((condition1 && condition2) || condition3 || conditionN_etc) { 

    // logic... 

    if (notable_condition) 
     continue; // skip remainder, go direct to evaluation portion of loop 

    // more logic 
    // maybe more notable conditions use keyword: continue 
} 

有些程序员可能会认为这是更好地把条件throughough逻辑,(即不循环头球攻门稍稍内),并聘请break声明在适当的地方出去。这种方法通常会否定确定何时离开循环的原始条件(即,而不是何时保持循环)。

// Always tests all conditions in body of loop logic: 
while(true) { 

    //logic... 

    if (!condition1 || !condition2) 
     break; // Break out for good. 

    // more logic... 

    if (!condition3) 
     break; 

    // even more logic ... 
} 

在现实生活中往往是一个更灰色混合物,所有这些东西的组合,而不是一个极化决定去这种或那种方式。

使用将取决于逻辑的复杂性和程序员的喜好..也许在此线程:)

的接受的答案也不要忘了do .. while。最终的解决方案可以使用该版本的while构造来将条件逻辑扭曲成他们的喜好。

do { 
    //logic with possible conditional tests and break or continue 
} while (true); /* or many conditional tests */ 

总之,作为一名程序员可以有选择。所以不要忘了感谢你的编译器作者。

+3

我更喜欢'do {...} while(false);';) – jcolebrand 2010-10-16 00:40:02

+0

@drachenstern:很好。 – 2010-10-16 00:42:21

+0

@John K〜Lol,我认为是这样;)...正在等待某人对我上面的加热器评论发表评论:p ~~另外,看看谁试图争论那个会很有趣......会爱知道谁花了不止一遍来弄清楚代码的功能。 – jcolebrand 2010-10-16 00:51:33

Edsger W. Dijkstra年轻的时候,它等同于:

  Do loop initialization 
label a: 
     Do some code 
     If (Loop is stoppable and End condition is met) goto label b 
        /* nowadays replaced by some kind of break() */ 
     Do some more code, probably incrementing counters 
     go to label a 
label b: 
     Be happy and continue 

Dijkstra后决定成为Antigotoist和程序员相信成群这样做,一个信仰来了在地球和代码感实性明显。

所以

Do loop initialization 
While (true){ 
    some code 
    If (Loop is stoppable and End condition is met) break(); 
    Do some more code, probably incrementing counters 
} 
Be happy and continue 

取代了憎恶。

对此不满意,狂热分子超过了。一旦证明,递归是更好的,更清晰,更普遍的是循环,而变量只是一个魔鬼般的化身,函数式编程,作为一个梦想,终于成真:

Nest[f[.],x, forever[May God help you break]] 

因此,循环递归变得真的不可阻挡,或者至少是不可阻挡的。

真正的要点是,当(真){..}是当退出条件的语义没有强烈的单一偏好,所以它对读者说很好的方式,“好吧,实际上有休息条件A,B ,C ..,但条件的计算过于冗长,因此按照预期的出现概率顺序将它们分别放入内部块中。