奇怪的循环行为

时间:2015-04-04 20:31:46

标签: c#

我有以下代码:

static void Main(string[] args)
{
    int i = 0;
    int k = 5 ;
    Console.WriteLine("i" + "   " + "k");
    for (i = 0; i < k; i++)
    {
        k--;
        Console.WriteLine(i + "   " + k);
    }
    Console.WriteLine(i); 
}

输出点在这里:

  

我知道

     

0 4

     

1 3

     

2 2

     

3

为什么它在达到2&lt; 1&lt; 1&lt; 1&gt;之后再次增加i。 2这不是真的吗?

4 个答案:

答案 0 :(得分:1)

条件为真(2 < 3)并且在检查条件后但在K写入之前减少Console,这会导致混淆。

答案 1 :(得分:1)

因为当你打印2,2时检查条件是i = 2&lt; k = 3然后在你的循环中减少k的值。

打印2,2后,将i的值增加到3并且循环结束

答案 2 :(得分:1)

试试这个:

static void Main(string[] args)
{
    int i = 0;
    int k = 5 ;
    Console.WriteLine("i" + "   " + "k");
    for (i = 0; i < k; i++)
    {
        Console.WriteLine(i + "   " + k);
        k--;
    }
    Console.WriteLine(i); 
}

您减少变量的顺序很重要。

答案 3 :(得分:0)

可以通过检查how a for loop works来解释循环结束时i == 3的原因。你的代码,

int i = 0;
int k = 5 ;
Console.WriteLine("i" + "   " + "k");
for (i = 0; i < k; i++)
{
    k--;
    Console.WriteLine(i + "   " + k);
}
Console.WriteLine(i); 

在语法上等同于

int i = 0;
int k = 5 ;
Console.WriteLine("i" + "   " + "k");
while ( i < k )
{
    k--;
    Console.WriteLine(i + "   " + k);
    i++;
}
Console.WriteLine(i); 

所以循环继续i < k。换句话说,在循环结束时,i < k为假。您的计划会输出2 2,但在WriteLine之后,{<1}}会在进行比较i++之前评估

为了进一步说明这一点,每次进行比较i < k时,这里的状态为ik

i < k

i k i < k 0 5 true 1 4 true 2 3 true 3 2 false // don't enter the loop 不为真时循环退出,在这种情况下,i < k为3且i为2时。