【问题标题】:initializing counter outside for loop doesn't work as intended在 for 循环外初始化计数器不能按预期工作
【发布时间】:2020-10-08 08:26:40
【问题描述】:

以下两个程序应该产生 1、2、3 的所有三个数字组合(重复)。它们在各方面都是相同的,除了循环计数器被初始化的地方

#include <stdio.h>
int main(void)
{
        short i, j, k;
        i = j = k = 1;
        for (; i <= 3; i++) {
                for (; j <= 3; j++) {
                        for (; k <= 3; k++)
                                fprintf(stdout, "%hi %hi %hi\n", i, j, k);
                }
        }
        return 0;
}

...三个循环的计数器在它们之外被初始化的这个不会产生所需的输出。它会打印出来。

1 1 1
1 1 2
1 1 3

第二个……

#include <stdio.h>
int main(void)
{
        short i, j, k;
        for (i = 1; i <= 3; i++) {
                for (j = 1; j <= 3; j++) {
                        for (k = 1; k <= 3; k++)
                                fprintf(stdout, "%hi %hi %hi\n", i, j, k);
                }
        }
        return 0;
}

...在每个循环中初始化计数器,产生所需的输出

1 1 1
1 1 2
1 1 3
1 2 1
1 2 2
1 2 3
1 3 1
1 3 2
1 3 3
2 1 1
2 1 2
2 1 3
2 2 1
2 2 2
2 2 3
2 3 1
2 3 2
2 3 3
3 1 1
3 1 2
3 1 3
3 2 1
3 2 2
3 2 3
3 3 1
3 3 2
3 3 3

在一本书中读到,for 循环可以用多种形式编写——所有这些形式都是相同的——并且计数器可以在 for 语句内部或外部进行初始化、递增和测试。那为什么会有不同的行为呢?

【问题讨论】:

    标签: c for-loop counter


    【解决方案1】:

    因为您没有在循环内初始化变量i, j, k,而是在外部范围内定义它们,所以它们的值保持保存。

    特别是k 保持为4,在第一个循环完成运行后,条件k&lt;=3 始终为假,永远不会到达打印语句。

    以与您的书相同的方式编写代码意味着这样:

    #include <stdio.h>
    int main(void)
    {
            short i, j, k;
            i = 1;
            for (; i <= 3; i++) {
                    j = 1;
                    for (; j <= 3; j++) {
                           k = 1;
                            for (; k <= 3; k++)
                                    fprintf(stdout, "%hi %hi %hi\n", i, j, k);
                    }
            }
            return 0;
    }
    

    【讨论】:

      【解决方案2】:

      在第二个中,每次遇到 for 循环时,变量 j 和 k 都会重新初始化为 1。

      在第一个中,它们总是只剩下它们所拥有的值 - 这意味着第二轮(当 i == 2 或 3 时),j 从第一个轮开始为 4,这立即不满足 j

      【讨论】:

        【解决方案3】:

        这与如何初始化 for 循环无关,而是每次启动 for 循环时都不会对其进行初始化。

                for (; i <= 3; i++) {
                    for (; j <= 3; j++) {
                            for (; k <= 3; k++)
        

        所以第一次没问题,因为值是正确的,但是在第二个和第三个 for 循环完成迭代并且第一个 for 循环到达第二个索引之后,其他 for 循环没有被初始化,因此它们的值保持 4 和条件没有得到满足,所以循环停在那里。 您仍然需要在嵌套的 for 循环中使用初始化来解决问题。

        【讨论】:

          【解决方案4】:

          如果您在for 循环之外只初始化一次变量,那么它们的值将永远不会在嵌套循环中重新初始化(您需要这样做才能生成以1xx2xx 开头的每个组合和3xx)。

          在外部初始化的情况下: 生成所有 11x 组合后,无论封闭循环做什么,您的 k 变量都将具有值 4

          因此,当ji 增加到23 时,您的k 将已经是4,因此最里面的for 循环将不再执行。

          不用说,您的代码的第二个变体会在每次 i 递增时重新初始化 kj,这将使您的代码每次都达到 printf 的预期。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多