【问题标题】:What is the difference between infinite while loops and for loops?无限while循环和for循环有什么区别?
【发布时间】:2011-04-01 22:31:40
【问题描述】:

我看到我读过的许多书中都使用了不同的约定,您可以在其中创建具有任一循环结构的无限循环,例如:

while()
   foo();
for(;;)
   foo();

但实际上,我应该知道哪些差异?哪个更好?

【问题讨论】:

    标签: c++ loops for-loop while-loop


    【解决方案1】:

    它们在语义上是等价的。 (x;y;z) { foo; } 等价于 x; while (y) { foo; z; }。它们在标准的其他版本中并不完全等效,在 for (int x = 0; y; z) 的示例中,x 的范围是 for 块,并且在循环结束后超出范围,而对于 int x; while (y) x,它仍在范围内循环结束后。

    另一个区别是for 将缺少的y 解释为TRUE,而while 必须提供一个表达式。 for (;;) { foo; } 很好,但 while() { foo; } 不是。

    【讨论】:

    • 仅供参考,问题是关于无限循环,而不是 for vs while 一般的语义。
    • 如果你想绕过声明x的局部性,你可能会说for (x; y; z) { foo; }等价于{ x; while (y) { foo; z; } }
    • 就语义而言,for循环的C语言标准允许构造一个与while循环相同的for循环。然而,这与对 for 循环更深层次的语义理解相冲突,for 循环总是包含循环变体(出于方便的原因,它通常被定义为相同的正数)。为了语义一致,应该明确区分在执行循环之前知道迭代计数的循环(for-loops)和在执行之前不知道迭代计数的循环(while-loops)。
    • 您的回答不准确。 "(int x = 0; y; z), x 的范围是 for 块,在循环结束后超出范围" 在所有版本中都是 true。 "int x; while (y) x"(语法错误)并且在所有版本中都具有 while 父级的位置。所以那部分没有完全达到目标。
    【解决方案2】:

    这是我在调试模式下看到的 VS2010 反汇编的一个小区别。不确定,是否足以算作显着普遍正确的差异(在所有编译器和所有优化中)。

    因此,从概念上讲,这些循环是相同的,但在处理器级别,由于有无限的消息循环,附加/不同指令的时钟周期可能不同,并产生一些差异。

       while(1)
    004113DE  mov         eax,1                       **// This is the difference**
    004113E3  test        eax,eax                     **// This is the difference**
    004113E5  je          main+2Eh (4113EEh)  
          f();
    004113E7  call        f (4110DCh)  
    004113EC  jmp         main+1Eh (4113DEh)          **// This is the difference**
       for(;;)
          f();
    004113EE  call        f (4110DCh)  
    004113F3  jmp         main+2Eh (4113EEh)          **// This is the difference**
    } 
    

    【讨论】:

    • 启用任何优化后肯定不存在这种差异。
    • 区别只是因为调试模式默认关闭了优化。前 3 行实际上是检查 1 != 0,即条件是否为真。
    • jmp的区别只是偏移量略有不同。
    • 我喜欢你的方法。这是真正的答案,但我宁愿在行上添加更多带有 cmets 的汇编代码。 for 循环中发生了很多事情。 for(;;) 的反汇编代码永远不会反映它,因为您的编译器 优化 它会破坏整个目的。 (例如,while(0){..} 将不会优化为空)。
    【解决方案3】:

    没有区别。

    除了在 while 循环中,你必须在那里放置一些真实的条件,例如while(1).

    另请参阅:Is "for(;;)" faster than "while (TRUE)"? If not, why do people use it?

    此外,“更好”的可能不是无限的。 :)

    【讨论】:

    • 其他问题很好找到。
    【解决方案4】:

    没有区别。

    但是

    while() foo();

    不一样

    for(;;foo();)

    记住!如果在 foo() 语句之前中断 while,则 foo() 不会执行,但如果中断 for,则 foo() 会执行...

    【讨论】:

      【解决方案5】:

      第一个不会编译。你至少需要:while( true )。它们在语义上是等价的。这是风格/个人选择的问题。

      【讨论】:

        【解决方案6】:

        它们都是相同的.. 现代编译器为两者发出相同的代码.. 有趣的是(从历史上看?)for(;;) 更受欢迎.. pascal 程序员曾经做过 #define (;;),并使用永远{//代码}

        【讨论】:

          猜你喜欢
          • 2021-06-28
          • 2022-12-17
          • 1970-01-01
          • 2011-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多