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

Esb*_*n86 7 java for-loop continue while-loop

我正在进行一项练习,其中基于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
Run Code Online (Sandbox Code Playgroud)

这转换为:

int i = 0, sum = 0;

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

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

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

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

for循环的版本:

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

i = 1,sum = 1,i ++

i = 2,sum = 3,i ++

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

i = 4,i <4 false,循环停止

while循环的版本:

i = 0,i ++,sum = 1

i = 1,i ++,sum = 3

i = 2,i ++,sum + =我没有预成型(续)

i = 3,i ++,sum = 7

i = 4,i <4 false,循环停止

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

int i = 0, sum = 0;

        while (i < 3) {
            i++;
            if (i % 3 == 0) continue;
            sum += i;           
        }

        System.out.println(sum);
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

1的注意力集中在初始值上,但这不是重点.关键是,ii % 3 == 0为真时永远不会递增,而不是0初始值.所以while循环永远循环.

2没有任何意义:while版本将永远循环,永远不会总结任何东西.

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

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

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

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

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

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

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

让你的while循环做for循环正在做的事情.(我故意为你做这个;这是一个学习练习.但是我会注意到转换那个for循环的最佳方法不会使用continue."最好,"当然是主观的.)


Jea*_*ard 5

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

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

你可以通过摆脱continue和否定条件轻松地解决它:

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

    i++;    
}
Run Code Online (Sandbox Code Playgroud)


use*_*460 3

问题给出的 for 循环如果转换为简单的英语意味着从0 到 3求和并排除3 的所有倍数。(0+1+2=3)

   for (int i = 0; i < 4; i++) {
        if (i % 3 == 0) continue;
        sum += i;   
    }
Run Code Online (Sandbox Code Playgroud)

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

将 0 到 3 之间的数字相加:

int i = 0;
while(i < 4){
    sum += i;
    i++;
}
Run Code Online (Sandbox Code Playgroud)

对 0 到 3 之间的数字求和,不包括 3 的倍数:

int i = 0;
while(i < 4){
    if(i % 3 != 0)
        sum += i;
    i++;
}
Run Code Online (Sandbox Code Playgroud)

对 0 到 3 之间的数字求和,不包括 3 的倍数(使用 continue):

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

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