首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#中for(;;)和while (true)的区别?

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

Stack Overflow用户
提问于 2010-07-28 04:04:00
回答 6查看 3.4K关注 0票数 17

在语法上,我看到它们会无限循环,直到到达break语句,但它们是编译成同样的东西吗?for是不是因为不需要检查条件而稍微快一点?除了代码的可读性之外,还有什么区别吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-28 04:09:08

给定以下输入:

代码语言:javascript
复制
private static void ForLoop()
{
    int n = 0;
    for (; ; )
    {
        Console.WriteLine(n++);
    }
}

private static void WhileLoop()
{
    int n = 0;
    while (true)
    {
        Console.WriteLine(n++);
    }
}

...you获取以下输出:

代码语言:javascript
复制
.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

非常相似,我会说(甚至是相同的)。

票数 36
EN

Stack Overflow用户

发布于 2010-07-28 04:06:08

在现代编译器中,什么都没有。

然而,从历史上看,for(;;)是作为单个跳转实现的,而while(true)也检查了true。

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

票数 21
EN

Stack Overflow用户

发布于 2010-07-28 04:06:01

我没有检查输出代码,但应该没有任何区别。任何优秀的编译器都会做足够简单的循环优化,以查看条件是一个常量表达式,因此不需要检查每个迭代。

如果其中一个比另一个快,那么C#编译器的编写者需要给他们一些东西……

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3347477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档