将带有continue语句的for循环转换为while循环

时间:2015-09-16 18:10:14

标签: java for-loop while-loop continue

我正在进行一项练习,其中基于for循环的一小段代码被转换为使用while循环执行相同的操作。转换目的是错误的,如下所示:

int sum = 0;

    for (int i = 0; i < 4; i++) {
        if (i % 3 == 0) continue;
        sum += i;   
    }
System.out.println(sum); // prints 3

这转换为:

int i = 0, sum = 0;

        while (i < 4) {
            if (i % 3 == 0) continue;
            sum += i;   
            i++;    
        }
System.out.println(sum); // will not print

在练习中,我被要求解释为什么转换错误然后修复它。我的想法是:

  1. 初始值 i = 0 ,这将在进入意志循环后立即触发继续,因为(0%3 == 0)会使 if-statement 为true。只要初始值为0,这将执行循环,以便跳过它无数次。我尝试更改 i = 1 的初始值,但是打印了noe sum。然后我尝试在执行 if-statement 之前增加 i ,程序现在打印总和7.这里的问题是;如果我在if语句之后递增,为什么程序不打印,即使i = 1的初始值表明(在我的脑海中)该程序应该正常运行?

  2. 我为每个程序制作了一个表来比较求和。

  3. for-loop 版本:

    i = 0,sum + = i未执行(继续),i ++

    i = 1,sum = 1,i ++

    i = 2,sum = 3,i ++

    i = 3,sum + = i未执行(继续),i ++

    i = 4,i&lt; 4假,循环停止

    while-loop 版本:

    i = 0,i ++,sum = 1

    i = 1,i ++,sum = 3

    i = 2,i ++,sum + =我没有预先形成(继续)

    i = 3,i ++,sum = 7

    i = 4,i&lt; 4假,循环停止

    while-loop 中,sum + = i的执行次数比 for循环更多。这是将 for-loop 转换为 while循环的正确方法吗?

    int i = 0, sum = 0;
    
            while (i < 3) {
                i++;
                if (i % 3 == 0) continue;
                sum += i;           
            }
    
            System.out.println(sum);
    

5 个答案:

答案 0 :(得分:5)

你的1专注于它是初始值,但这不是重点。关键是当i为真时i % 3 == 0永不递增,而0不是初始值。所以while循环永远循环。

您的2没有任何意义:while版本将永远循环,永远不会总结任何内容。

  

这是将for循环转换为while循环的正确方法吗?

不,你在错误的时间递增i

想一下for循环是如何工作的:

  1. 初始化 - 首先,它将变量设置为第一个表达式中的值。

  2. 测试 - 然后使用第二个表达式测试值。

  3. 执行 - 如果值为true,则执行循环体。

  4. 增量 - 当循环体完成时,它执行第三个(增量)表达式。请注意,这是之后循环体。

  5. while循环执行for循环正在执行的操作。 (我故意为你做这件事;这是一个学习练习。我会注意到转换for循环的最佳方式不会使用continue,然而,“最好”,当然是主观的。)

答案 1 :(得分:5)

  

在练习中,我被要求解释转换错误的原因,然后解决它

转换是错误的,因为当你达到模数3等于0的i值时(在这种情况下是第一次迭代),你将跳到下一次迭代并重新验证。但是,由于您在不增加i的情况下直接跳过,因此您将重新验证相同的条件并重新验证 ad-infinitum

你可以通过摆脱continue并取消条件来轻松解决问题:

while (i < 4) {
    if (i % 3 != 0)
        sum += i;

    i++;    
}

答案 2 :(得分:3)

问题给出的 for-loop 如果转换为普通英语,则表示总结 0到3 < / strong>并排除所有3的倍数。 (0 + 1 + 2 = 3)

   for (int i = 0; i < 4; i++) {
        if (i % 3 == 0) continue;
        sum += i;   
    }

现在,我们问自己,我们如何将0加到x并使用 while-loop 排除所有3的倍数。我们将在不查看原始 for-loop 的情况下执行此操作。 (有时这样做更容易,因为我们已经知道了for循环的意图

总结0到3之间的数字:

int i = 0;
while(i < 4){
    sum += i;
    i++;
}

要将0到3之间的数字相加,不包括3的倍数:

int i = 0;
while(i < 4){
    if(i % 3 != 0)
        sum += i;
    i++;
}

要将0到3之间的数字相加,不包括3的倍数(使用继续):

int i = 0;
while(i < 4){
    if(i % 3 == 0){
        i++;       //Remember to increase i before continue
        continue;
    }
    else
        sum += i;
    i++;
}

continue之后,将跳过下面的所有语句,您必须记住在调用i++之前执行增量continue。由于您现在已分为2个条件,因此将会有另一个i++

答案 3 :(得分:1)

根据while循环逻辑,变量i的增量是有条件的,而for循环则是无条件的。要使增量逻辑均匀,您应该在两种情况下递增。

我认为正确的转换是 -

int i = 0, sum = 0;

while (i < 4) {
    if (i % 3 == 0) {i++;continue;}
    sum += i;   
    i++;   
}
System.out.println(sum);

答案 4 :(得分:0)

通常,增量将在while循环的最后一行。然而,在这场等待发生的灾难中#34;代码,有条件跳转到while块的末尾而不增加i。如果依靠i递增,请确保它始终在任何迭代上执行。而且,最后,因为你希望它第一次迭代。

    while (i < 4) {
        if (i % 3 == 0) {
          // skip!
        } else {
          sum += i;   
        }
        i++;    
    }