【问题标题】:For loop why the variable out of the loop is "last index" + step?For循环为什么循环外的变量是“最后一个索引”+步骤?
【发布时间】:2013-12-16 14:39:46
【问题描述】:

我只是想知道为什么会这样:

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 ?为什么它会增加?

任意?

谢谢,

【问题讨论】:

  • 循环运行只要 iis 5 时它才会停止。因此,完成时当然是 5。当它为 4 时,尚未满足中断条件。
  • @Larry 既然我们有 7 个答案都是零票,你会这么好心并选择获胜者吗? :)(接受答案)
  • 我注意到许多答案(似乎用不同的词在说同样的事情)得到了赞成票和反对票,净为零。奇怪吗?
  • 这种情况下最难的就是选择赢家!所有的答案都非常有启发性! :)
  • @Larry - 在这种情况下,没有“错误答案”可供您选择 - 只有您认为最有帮助的答案(正如您评论的那样,“简单的语言”)。很高兴我们能够提供帮助。

标签: c for-loop increment


【解决方案1】:

for 语句中包含三个子句。

  1. init-stmt 语句在循环开始之前完成,通常 初始化迭代变量。
  2. 每次循环之前都会测试条件表达式 完毕。如果布尔表达式为假,则不执行循环 (与 while 循环相同)。
  3. next-stmt 语句在主体执行后完成。它 通常会增加一个迭代变量。

因此,每个 for 循环执行结束,执行递增操作,并且在第 4 次迭代中,i 的值为 5,并且 for 循环在第 5 次迭代中被中断,因为值为 5。

【讨论】:

  • 这是对正在发生的事情的一个很好的简单解释
  • 虽然 Fortran 的行为方式相同,但请您帮我理解为什么 Matlab 或 Python 不是这种情况?
【解决方案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

【讨论】:

    【解决方案3】:

    for 循环是如何工作的:

    for (initialization; condition; increment-decrement)
        Statement
    
    1. 运行初始化 (i=0)
    2. 检查条件(i&lt;5),如果为真则跳转到3,否则跳转到5
    3. Do 声明 ({ printf("%d\n",i) })
    4. 做增减(i++),跳转到2
    5. 退出循环

    在上次迭代 i == 4 之前,它会打印 4,递增 i。因此在最后一次迭代后i == 5,!(5 &lt; 5),即条件为假,退出循环。

    【讨论】:

      【解决方案4】:

      在每次迭代结束时,循环索引递增。然后程序检查是否运行另一个循环。它发现“no index is too big and failed the condition”,所以它不执行并退出。

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

      这就是为什么...

      【讨论】:

        【解决方案5】:

        因为在第四次循环之后:

        1. 执行i++i变成5
        2. i&lt;5 被评估为 false
        3. 因此循环退出

        然后你在循环结束后得到i==5

        确实,在每个循环之后,在检查退出条件 i&lt;5 之前评估 i++

        【讨论】:

          【解决方案6】:

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

          1. i &lt;- 0
          2. 检查是否i &lt; 5,如果是则循环,否则停止
          3. 做循环
          4. i &lt;- i + 1
          5. 进入第 2 步

          【讨论】:

            【解决方案7】:

            让我们看看这个循环:

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

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

            现在

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-06-17
              • 2023-03-19
              • 2012-10-20
              • 2016-08-31
              • 1970-01-01
              • 2015-09-22
              • 2021-04-07
              相关资源
              最近更新 更多