【问题标题】:Confusion about for loop in c: increment logic in c language关于c中for循环的困惑:c语言中的增量逻辑
【发布时间】:2019-03-24 23:36:51
【问题描述】:

我对循环增量的 C 语言的基本概念感到困惑。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int j=0;int a;
    for(j;j<=3;++j)
    {
        printf("hello\n");
        a=j;
    }
    printf("%d,%d\n",j,a);
}

我的问题是:为什么a的输出不等于j的输出?我在想,如果j 每次迭代都会增加,并且j 的值存储在a 中,那为什么不一样呢?

【问题讨论】:

  • 因为j在分配给a后会递增。 (我也不会在for 循环控制的第一部分写j。它什么也不做。我要么写for (j = 0; j &lt;= 3; j++)(并省略变量定义中的初始化)或for ( ; j &lt;= 3; j++)。我可能也会使用&lt; 4 而不是&lt;= 3;它通常更正统的C,尤其是因为它是迭代4个元素的数组的正确方法。但是,这些括号中的观察与您的主要关注点相切.)
  • 感谢@JonathanLeffler!现在我的困惑被清除了。 :)

标签: c for-loop increment post-increment pre-increment


【解决方案1】:

对于j=0a=0

对于j=1a=1

对于j=2a=2

对于j=3a=3

对于j=4loop 被终止为j&lt;=3become false,所以 j 值为 4,a 值为 3。

【讨论】:

    【解决方案2】:

    直到j&lt;=3 条件j 的值被分配给a 但之后当j 增加1 (j==4) 时,它作为@987654325 的值从循环中跳出@ 现在是 4,它没有将 j 的值分配给 a。所以最后我们得到了a=4j=3

    【讨论】:

      【解决方案3】:

      当我们在循环概念中使用前缀递增时,我们应该小心一点。

      For j=0 a=0#第一次迭代

      For j=1 a=1#2nd 迭代

      For j=2 a=2#第三次迭代

      For j=3 a=3 #4th 迭代

      对于j=4,由于条件不满足,控制退出for循环。但是j 的值会提前增加,因此它会输出"4"

      【讨论】:

        【解决方案4】:

        for 循环在每次迭代时检查条件。因此,当您初始化 j=0 时,给出以下代码循环到 j&lt;=3 的条件,同时在每次迭代后递增 j 的值,循环执行相同的操作。

        所以对于第一次迭代,j 为 0,因此条件满足,a 被赋值为j。现在j 的值增加了 1。它一直持续到 j=3。

        当 j=3 时,a 也等于 3。现在 j 的值加 1,等于 4。现在检查条件。从j!=3 开始,循环中断并且您移出循环。因此,虽然 j=4,a 仍然是 3。

        希望对你有帮助。

        【讨论】:

          【解决方案5】:

          第一个:

           j = 0 
           j <= 3 => print hello and a = 0, ++j
          

          第二个:

           j = 1
           j <= 3 => print hello and a = 1, ++j
          

          第三:

           j = 2
           j <= 3 => print hello and a = 2, ++j
          

          第四:

           j = 3
           j <= 3 => print hello and a = 3, ++j
          

          第 5 次:

           j = 4 not satisfy j <= 3
          

          所以 j = 4 和 a =3

          【讨论】:

            【解决方案6】:

            这与for循环中3个表达式的执行方式有关。

            考虑

            for( exp1; exp2; exp3)
            {
                body;
            }
            

            这将像这样执行:

            exp1;
            if (exp2 == false) goto end_of_loop;
            body;
            exp3;
            if (exp2 == false) goto end_of_loop;
            body;
            exp3;
            if (exp2 == false) goto end_of_loop;
            body;
            exp3;
            if (exp2 == false) goto end_of_loop;
            . . . 
            . . .
            
            end_of_loop:
            

            如您所见,exp3 总是在body 之后执行一次。

            因此,在您的情况下,j 将在分配给 a 后增加一次。 喜欢:

             a=j; // part of body
             ++j; // exp3
             j<=3 (exp2) becomes false and the loop ends
            

            【讨论】:

              猜你喜欢
              • 2023-04-01
              • 1970-01-01
              • 1970-01-01
              • 2017-05-03
              • 1970-01-01
              • 2012-03-26
              • 2016-01-30
              • 2019-01-02
              • 2017-06-08
              相关资源
              最近更新 更多