C#中for(;;)和while(true)之间的区别?

Cor*_*urn 17 c#

从语法上来说,我看到它们无限循环,直到达到break语句,但它们是否编译为同一个东西?因为它没有条件可以检查吗?除了代码可读性之外,还有差别吗?

Fre*_*örk 36

鉴于此输入:

private static void ForLoop()
{
    int n = 0;
    for (; ; )
    {
        Console.WriteLine(n++);
    }
}

private static void WhileLoop()
{
    int n = 0;
    while (true)
    {
        Console.WriteLine(n++);
    }
}
Run Code Online (Sandbox Code Playgroud)

...你得到这个输出:

.method private hidebysig static void  ForLoop() cil managed
{
  // Code size       14 (0xe)
  .maxstack  3
  .locals init ([0] int32 n)
  IL_0000:  ldc.i4.0
  IL_0001:  stloc.0
  IL_0002:  ldloc.0
  IL_0003:  dup
  IL_0004:  ldc.i4.1
  IL_0005:  add
  IL_0006:  stloc.0
  IL_0007:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_000c:  br.s       IL_0002
} // end of method Program::ForLoop


.method private hidebysig static void  WhileLoop() cil managed
{
  // Code size       14 (0xe)
  .maxstack  3
  .locals init ([0] int32 n)
  IL_0000:  ldc.i4.0
  IL_0001:  stloc.0
  IL_0002:  ldloc.0
  IL_0003:  dup
  IL_0004:  ldc.i4.1
  IL_0005:  add
  IL_0006:  stloc.0
  IL_0007:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_000c:  br.s       IL_0002
} // end of method Program::WhileLoop
Run Code Online (Sandbox Code Playgroud)

非常相似,我会说(相同,甚至).

  • 嗯,第5行有区别......哦,等等,这不是我显示器上的一个位置;) (18认同)
  • 我们真的在讨论无限循环的相对速度吗? (8认同)
  • @Steven:我当然希望不是.我们满足了我们的好奇心.至少我是. (2认同)

Mik*_*ron 21

在现代编译器中,绝对没有.

然而,从历史上看,for(;;)它实现为单跳,同时while(true)也检查为真.

我更喜欢while(true),因为它让我更清楚我在做什么.

  • 如果我们使用`goto`,我认为世界不会结束,但它可能会突然跳到宇宙中的新位置. (6认同)
  • 我的天啊!不是'转到`!如果我们使用它,世界将结束! (5认同)
  • 绝对+1.`while(true)`比`for(;;)`清楚得多.无论如何,我还在等什么? (2认同)
  • 为什么不`循环:...转到循环`? (2认同)