在语法上,我看到它们会无限循环,直到到达break语句,但它们是编译成同样的东西吗?for是不是因为不需要检查条件而稍微快一点?除了代码的可读性之外,还有什么区别吗?
发布于 2010-07-28 04:09:08
给定以下输入:
private static void ForLoop()
{
int n = 0;
for (; ; )
{
Console.WriteLine(n++);
}
}
private static void WhileLoop()
{
int n = 0;
while (true)
{
Console.WriteLine(n++);
}
}
...you获取以下输出:
.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
非常相似,我会说(甚至是相同的)。
发布于 2010-07-28 04:06:08
在现代编译器中,什么都没有。
然而,从历史上看,for(;;)
是作为单个跳转实现的,而while(true)
也检查了true。
我更喜欢while(true)
,因为它让我更清楚自己在做什么。
发布于 2010-07-28 04:06:01
我没有检查输出代码,但应该没有任何区别。任何优秀的编译器都会做足够简单的循环优化,以查看条件是一个常量表达式,因此不需要检查每个迭代。
如果其中一个比另一个快,那么C#编译器的编写者需要给他们一些东西……
https://stackoverflow.com/questions/3347477
复制相似问题