C#中循环的工作原理

7

最近,我在一本书中看到了这段代码。你能解释一下这段代码的含义以及它是如何工作的吗?

int i = 0; 
for (; i != 10; ) 
{ 
    Console.WriteLine(i); 
    i++; 
}

有趣的,以前没见过这样的... - Matt
@Yoda - 可能是因为这样做不太好。虽然合法,但并不得体。 - Mitch Dempsey
惊讶于你的问题没有得到任何赞同。点个赞,因为你回归了基础。 - Jim Burger
我会集中精力于foreach循环和枚举集合上,这是更常见(也更符合惯用法)的C#写法。 - TrueWill
可能有一些情况需要你这样做,但我目前想不到任何一个。对我来说,这是一种糟糕的代码味道,我肯定不会像那样构建我的循环。 - Jimmy Chandra
8个回答

13

它循环。

由于您在上面已经设置了 i = 0,因此他们省略了 for 循环的该部分。另外,由于您是在末尾递增变量,他们也省略了那部分。

他们基本上只是将 for 循环转换为 while 循环。

可能更优雅的写法是:

int i = 0; 
while( i != 10 ) 
{ 
    Console.WriteLine(i); 
    i++; 
}

2
除了在循环外初始化 i 以扩大其作用域之外,这也允许在循环内根据条件进行增量操作,例如 i+=2 或 i--,而无需考虑 for 循环的第三部分中指定的内容。但是,我认为与 while 循环相同。 - Jacob
@Jacob,对于作用域捕获的点赞,我甚至没有想到。 - Mitch Dempsey

2

在C#规范中,for语句的定义如下:

for (for-initializer; for-condition; for-iterator) embedded-statement

for-initializerfor-conditionfor-iterator这三个部分都是可选的。即使这些部分缺失,代码也能正常工作。

如果省略了for-condition,循环将像存在一个始终为真的for-condition一样运行,因此会形成无限循环,需要使用跳转语句(breakgotothrowreturn)来退出循环。


1

如果以正常形式更容易理解,那么它几乎等同于这个:

for (int i = 0; i != 10; i++) 
{ 
    Console.WriteLine(i); 
}

除了在循环完成后将i留给用户使用之外,它并不仅限于for循环的范围。


1

这与此循环相同:

for (int i = 0; i != 10; i++) {
  Console.WriteLine(i); 
}

除此之外,变量i是在循环外声明的,因此其作用域更大。

for循环中,第一个参数是初始化,第二个参数是条件,第三个参数是增量(实际上可以是任何东西)。该书展示了如何将初始化和增量移到代码中实际执行的位置。该循环也可以表示为等效的while循环:

int i = 0;
while (i != 10) {
  Console.WriteLine(i);
  i++;
}

这里变量i也在循环外声明,因此作用域更大。


1

这段代码可以重新编写,(在您的代码片段的上下文中 - 如所述不是等效的。)如下:

for (int i = 0; i != 10; i++)
    Console.WriteLine(i);

基本上,初始化表达式和增量表达式已从for循环表达式中拿出来,它们是完全可选的。

我想指出你所发布的内容并不是“等价的”,因为存在作用域差异。 - Nick Craver

1

你正在使用“for”循环,就像使用“while”一样


0

这与以下内容相同:

for (int i = 0; i != 10; i++) {
    Console.WriteLine(i);
}

请不要写那样的代码。 它很丑陋,而且违背了for循环的初衷。

0

由于 int i 是在顶部声明的,所以它不在 for 循环中。 这很像。

for(int i = 0; i!=10; i++)
{
   /// do your code
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接