【问题标题】:For-loop still increments after execution condition false执行条件为假后,for循环仍然递增
【发布时间】:2018-05-22 02:41:29
【问题描述】:

我是 C 的新手,所以这个问题很可能有一个简单的解决方案,但我看不到。我注意到我的输出不是我所期望的,经过几个小时的调试后,我意识到我的一个 for 循环没有按预期运行。这是我的代码的相关部分:

for (i = 0; i < bytes; i++)
        {
            if ((temp_array[i]) == 0xCADE | (temp_array[i]) == 0xDADA)
            {

                printf("i is %d\n",i );
                i += 2;

                printf("i is now %d\n",i );

                n_body = temp_array[i];

                i++;

                printf("n_body is %d\n",n_body );

                for (count = 0, j = flag_index; count < n_body; i++, j++, count++)
                {

                    machine->memory[j] = temp_array[i];
                    printf("LETS SEE, i in loop is %d\n",i );
                    printf("LETS SEE, j in loop is %d\n",j );
                    printf("LETS SEE, count in loop is %d\n", count);

                }

                printf("\n");
                printf("LETS SEE, i out of loop is %d\n",i );
                printf("LETS SEE, j out of loop is %d\n",j );
                printf("LETS SEE, count out of loop is %d\n", count);

                machine->memory[j+1] = flag;

                //printf("flag is %d\n",flag );
                printf("machine memory index 18 is %d \n", machine->memory[18]);

            }

            // else
            // {
            //  continue;
            // }

            //printf("index is %d\n",i );
        }

罪魁祸首是第二个(嵌套的)for 循环。我注意到一旦执行条件count &lt; n_body不再为真,变量 i、j 和 count 就会增加。在这个特定的点上,n_body 是 18,i 是 3,bytes 是 64,flag_index 是 0。我已经发布了 for 循环最后几次迭代的输出和 print 的输出for 循环外的语句:

LETS SEE, i in loop is 18
LETS SEE, j in loop is 15
LETS SEE, count in loop is 15
LETS SEE, i in loop is 19
LETS SEE, j in loop is 16
LETS SEE, count in loop is 16
LETS SEE, i in loop is 20
LETS SEE, j in loop is 17
LETS SEE, count in loop is 17

LETS SEE, i out of loop is 21
LETS SEE, j out of loop is 18
LETS SEE, count out of loop is 18

为什么它们会增加?我认为一旦执行条件不再为真,for循环就会关闭(执行主体和前置增量)?

【问题讨论】:

  • 您确定要按位或| 而不是逻辑或||
  • 如果 count &lt; 18 失败,count 必须达到 18 ...不知道为什么你会期望它在 17 结束。
  • 你在两个循环中增加i,例如for (i = 0; i &lt; bytes; i++) ... for (count = 0, j = flag_index; count &lt; n_body; i++, ...)
  • @Schwern,感谢您的关注。我确实想要一个逻辑 OR,这是我的错误。

标签: c for-loop


【解决方案1】:

它更新任何变量然后测试条件。如果条件为真,则再次进行。如果为假,则退出。因此,如果你有for(x = 0; x &lt; 5; ++x);,如果你在循环外打印它,x 的值将为 5(x 必须为 5,x

如果你搜索,你可以在网上找到 for 循环的流程图。这是来自 geeksforgeeks 的一个:

【讨论】:

    【解决方案2】:

    这是正常的。您可以通过一个小型演示程序来查看。

    #include <stdio.h>
    
    int main() {
        int i = 0;
        for( i = 0; i < 3; i++ ) {
            printf("i in loop: %d\n", i);
        }
        
        printf("i after loop: %d\n", i);
    }
    
    $ ./test
    i in loop: 0
    i in loop: 1
    i in loop: 2
    i after loop: 3
    

    标准的相关部分是这样的:

    6.8.5.3 for 声明

    1 声明

    for ( clause-1 ; expression-2 ; expression-3 ) statement

    的行为如下: 表达式 expression-2 是在每次执行循环体之前计算的控制表达式。 在每次执行循环体后,表达式 expression-3 被评估为 void 表达式。

    每次执行主体时,都会发生增量。如果 body 运行 3 次,那就是 i++ 的 3 次迭代。

    你也可以考虑这样的 for 循环。

    // for( int i = 0; i < 3; i++ ) {
    int i = 0;
    while( i < 3 ) {
        printf("i in loop: %d\n", i);
        i++;
    }
    

    所以你的内部循环相当于..

    // for (count = 0, j = flag_index; count < n_body; i++, j++, count++) {
    count = 0, j = flag_index;
    while( count < n_body ) {                
        machine->memory[j] = temp_array[i];
        i++, j++, count++;
    }
    

    【讨论】:

    • 谢谢。示例程序澄清了我的错误。看起来我将不得不手动减少 for 循环之外的索引变量,以便它们具有我需要的程序其余部分的值。我希望有一种更精简的方式......
    猜你喜欢
    • 1970-01-01
    • 2018-08-15
    • 2016-10-29
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多