代码之家  ›  专栏  ›  技术社区  ›  Bob Kaufman

对于(;)或while(true),哪个是正确的C无限循环?[关闭]

  •  82
  • Bob Kaufman  · 技术社区  · 15 年前

    回到我的C/C++天,编码一个“无限循环”

    while (true)
    

    感觉更自然,对我来说更明显,而不是

    for (;;)
    

    与…相遇 PC-lint 在20世纪80年代后期以及随后的最佳实践讨论中,我打破了这个习惯。我已经用 for 控制语句。今天,作为一个C开发人员,我第一次需要无限循环,这是很长一段时间以来的第一次,我也面临同样的情况。其中一个正确,另一个不正确吗?

    20 回复  |  直到 7 年前
        1
  •  113
  •   Adam Robinson    15 年前
    while(true)
    {
    
    }
    

    总是我所用的,我所看到的其他人所用的循环,必须手动打破。

        2
  •  291
  •   Peter Mortensen icecrime    7 年前

    C编译器将转换

    for(;;)
    {
        // ...
    }
    

    while (true)
    {
        // ...
    }
    

    进入之内

    {
        :label
        // ...
        goto label;
    }
    

    两者的CIL相同。大多数人发现 while(true) 更容易阅读和理解。 for(;;) 相当神秘。

    来源:

    我把事情搞得更糟了 .NET Reflector 在Visual Studio中,我使用“优化代码”编译了这两个循环。

    两个循环编译为(使用.NET Reflector):

    Label_0000:
        goto Label_0000;
    

    Raptors should attack soon.

        3
  •  58
  •   RSolberg    15 年前

    我认为这可能更容易阅读,而且绝对是C中使用的标准:

    while(true)
    {
       //Do My Loop Stuff
    }
    
        4
  •  42
  •   Community CDub    7 年前

    喘气,使用:

    while (!false)
    {
    
    }
    

    或作为 jsight 指出,你可能要加倍肯定:

    while (!false && true)
    {
    }
    

    在人们冲我大喊大叫之前,我查了一下,这都是CIL代码。

        5
  •  35
  •   Ben Blank    15 年前

    再重复几个老笑话:

    1. 不要使用“ for (;;) {} “_”,这让声明大声疾呼。
    2. 当然,除非你 #define EVER ;; “。
        6
  •  24
  •   Peter Mortensen icecrime    7 年前

    如果你想上老校,go to仍然得到C的支持:

    STARTOVER:  
        //Do something
        goto STARTOVER;
    

    对于一个真正的无限循环,这是go to命令。=)

        7
  •  20
  •   Thom Smith    12 年前

    我想 while (true) 可读性更强。

        8
  •  10
  •   Michael Petrotta user3140870    15 年前

    在我需要一个真正的无限循环的情况下,我总是使用

    while(true) {...}
    

    它似乎比空的for语句更能表达意图。

        9
  •  8
  •   Pavel Minaev    15 年前

    就我个人而言,我一直更喜欢 for(;;) 正是因为它 条件(与 while (true) 它总是真实的)。然而,这真的是一个非常微小的风格点,我觉得无论哪种方式都不值得争论。我还没有看到一个C风格的指导方针,强制或禁止任何一种方法。

        10
  •  6
  •   Michael Burr    15 年前

    我个人更喜欢 for (;;) 习语(来自C/C++的观点)。虽然我同意 while (true) 在某种意义上,它更可读(也是我在C/C++中使用的方式),我已经转向使用 for 习语,因为:

    • 它突出

    我认为循环不终止(以正常方式)这一事实值得“叫出”,我认为 对于(;;) 再多做一点。

        11
  •  6
  •   David R Tribble    8 年前

    原版 K&R C的书,从中C可以追溯其祖先,建议

    for (;;) ...
    

    对于无限循环。它不含糊,易读,背后有着悠久而高贵的历史。

    补遗 (2000年2月2017日)

    当然,如果你认为这个循环形式(或任何其他形式)太神秘,你可以 添加评论 .

    // Infinite loop
    for (;;)
        ...
    

    或:

    for (;;)    // Loop forever
        ...
    
        12
  •  4
  •   Thom Smith    12 年前

    应该是 while(true) while(1) 如此 (1) C中的错误,是;)

        13
  •  2
  •   bobbymcr    15 年前

    我更喜欢“识字”代码。在实践中,我更有可能这样做:

    bool shouldContinue = true;
    while (shouldContinue)
    {
        // ...
    
        shouldContinue = CheckSomething();
    }
    
        14
  •  2
  •   Peter Mortensen icecrime    7 年前

    即使我也说下面的一个更好:)

    while(true)
    {
    
    }
    
        15
  •  1
  •   Chris Chilvers    15 年前

    或者你也可以说拥有一个无限循环通常是不好的实践,因为它需要一个退出条件,除非这个应用真的永远运行。然而,如果这是一个巡航导弹,我会接受一个明确的退出条件可能不需要。

    虽然我喜欢这个:

    for (float f = 16777216f; f < 16777217f; f++) { } 
    
        16
  •  1
  •   sobellian    15 年前

    如果你是代码高尔夫,我建议 for(;;) . 除此之外, while(true) 具有相同的含义,似乎更直观。无论如何,大多数编码人员可能会理解这两种变化,所以这并不真正重要。使用最舒适的。

        17
  •  1
  •   Peter Mortensen icecrime    7 年前

    我想说的唯一原因 for(;;) 是由于codedom限制(虽然不能使用codedom声明循环,而for循环被视为更一般的迭代循环形式)。

    这是一个很宽松的理由来选择这个,而不是事实上 for 循环实现既可以用于普通代码,也可以用于codedom生成的代码。也就是说,它可以更标准。

    作为注释,可以使用代码段创建 while 循环,但整个循环需要是一个片段…

        18
  •  1
  •   Peter Mortensen icecrime    7 年前

    它们都有相同的功能,但人们通常更喜欢 while(true) . 很容易阅读和理解…

        19
  •  0
  •   George    15 年前

    对于while循环,任何始终返回true的表达式都应该是OK。

    例子:

    1==1 //Just an example for the text stated before 
    true
    
        20
  •  0
  •   Thom Smith    12 年前

    在代码可读性方面 while(true) 无论用什么语言,我都觉得更有意义。在计算机如何看待它的问题上,在当今高效率的编译人员和口译员的社会中,确实不应该有任何区别。

    如果有任何性能上的差异,我相信翻译成微星将优化了。如果你真的想的话,你可以检查一下。