对于循环,为什么循环中的变量是“最后一个索引”+步骤?

时间:2013-11-30 15:36:01

标签: c for-loop increment

我只是想知道为什么:

int i;

for (i=0; i<5; i++){

    printf("%d\n",i)

}

printf("Here i get the result that misleads me : %d\n",i)

最后一个值是5.

我的逻辑是:

From 0 to 4 -> printf

If i > 4 (since we are dealing with integers) stop the loop.

但循环停在4而不是5!循环后为什么我得到5?它为什么会增加?

任意吗?

谢谢,

7 个答案:

答案 0 :(得分:2)

展开正在发生的事情

int i = 0;

while( i < 5 )
{
   // body of for loop

   i++;
}

// i == 5 here as i must be greater than or equal to 5 to break out of while loop

答案 1 :(得分:2)

for语句中有三个条款。

  1. init-stmt语句通常在循环开始之前完成 初始化迭代变量。
  2. 在每次循环之前测试条件表达式 完成。如果布尔表达式为false,则不执行循环 (与while循环相同)。
  3. next-stmt语句在执行主体后完成。它 通常会增加迭代变量。
  4. 因此,每个for循环执行结束,执行递增操作,并且在第4次迭代中,i的值为5,for循环中断,因为第5次迭代中的值为5。

答案 2 :(得分:2)

for循环如何工作:

for (initialization; condition; increment-decrement)
    Statement
  1. 运行初始化(i=0
  2. 检查条件(i<5),如果为真,则跳转到3否则跳转到5
  3. 做声明({ printf("%d\n",i) }
  4. 执行递增递减(i++),跳转到2
  5. 退出循环
  6. 在最后一次迭代i == 4之前,它会打印4,递增i。因此,在最后一次迭代i == 5!(5 < 5)之后,即条件为假,退出循环。

答案 3 :(得分:1)

在每次迭代结束时,循环索引递增。然后程序检查是否运行另一个循环。它发现“没有索引太大并且条件失败”,因此它不会执行并退出。

在索引变得太大之前,条件不会失败。它必须变得太大(所以循环不会执行)。

这就是为什么......

答案 4 :(得分:1)

因为在第4次循环之后:

    执行了
  1. i++i变为5
  2. i<5评估为false
  3. 因此循环退出
  4. 然后在循环结束后得到i==5

    确实,在每次循环之后,在检查退出条件i++之前评估i<5

答案 5 :(得分:1)

for (int i = 0; i < 5; ++i)是这样的:

  1. i <- 0
  2. 检查是否i < 5,如果是,则循环,否则停止
  3. 做循环
  4. i <- i + 1
  5. 转到第2步

答案 6 :(得分:0)

让我们看看这个循环:

for (i = 0; 0; i++)
    do_smth();

你会看到这个循环根本不执行。因为条件从一开始就是假的。

现在

for (i = 0; i < 4; i++)
    i++;

每次运行显然会增加i两次(一次在循环内,然后,因为for的第三部分)。最后,i将具有使条件为假的第一个偶数值。那是6。因此,步骤和循环外变量的值之间没有联系。