for循环和while循环总是可以互换的

时间:2013-01-17 07:03:26

标签: java

我理解一个人在某种情况下具有某些优势的概念,这取决于具体情况但是在每种情况下它们是否可以互换?我的教科书写了

for (init; test; step) {
    statements; 
} 

相同
init; 
while (test) { 
    statements; 
    step; 
} 

如何在for循环中重写以下程序?如果我将以下程序重写为for循环形式,我在设置init和测试的值时遇到问题。

import acm.program.*;

public class DigitSum extends ConsoleProgram{  
public void run() {
     println("this program sums the digits in an integer");
     int n = readInt("enter a positive number: ");
     int dsum = 0;
     while ( n > 0) {
       dsum += n % 10;
       n /=10;
     }
    }
   }

7 个答案:

答案 0 :(得分:8)

int dsum = 0;
for(int n = readInt("enter a positive number: "); n > 0; n /=10) {
   dsum += n % 10;
 }

答案 1 :(得分:4)

由于我不能阻止自己写这篇文章,所以我会指出它。

你的for循环: -

for (init; test; step) {
    statements; 
} 

与您发布的while循环不同。 for循环的init在循环外部不可见,而在while循环中,它将是。因此,它只是在init循环的for部分中声明的变量的范围。它就在循环内部。

所以,这是你的for循环的确切转换: -

{
    init; 
    while (test) { 
        statements; 
        step; 
    }
} 

就您的具体案件的转换而言,我认为您已经得到了答案。


嗯,通过上面的解释,你的while循环的确切转换与上面的@Eric's版本略有不同,如下所示: -

int dsum = 0;
int n = 0;
for(n = readInt("enter a positive number: "); n > 0; n /=10) {
    dsum += n % 10;
}

请注意,这对@Eric's答案的修改很少,因为它在for循环之外有循环变量n的声明。这只是我给出的解释。

答案 2 :(得分:2)

除了在初始值设定项中声明的变量范围之外,还有另一个时间for将表现出不同的行为,即存在continue

for (init; test; update) {
    if(sometest) { continue; }
    statements; 
} 

NOT

相同
init; 
while (test) { 
    if(sometest) { continue; }
    statements; 
    update; 
} 

因为在while循环中continue它会跳过update,而for循环则不会。{/ p>

要通过最典型的示例来展示这一点,请考虑以下两个循环(感谢@Cruncher):

// terminates
for(int xa=0; xa<10; xa++) { continue; }

// loops forever
int xa=0;
while(xa<10) { continue; xa++; }

答案 3 :(得分:1)

+1,好问题

两者之间的区别主要是眼睛糖果。在一个例子中,人们可能只是阅读比另一个更好。对于您的示例,以下是单行代码中的for循环等效项。但是,在这种情况下,while循环更容易阅读。

public void run() {
  println("this program sums the digits in an integer");
  for (n = readInt("enter a positive number: "), dsum=0; n > 0; dsum+=n%10, n/=10);
}

答案 4 :(得分:1)

是的,除了两件事:

  1. “For”让你声明并初始化你的条件(=变量,btw - 多个变量!),然后当你离开“For”循环时它会自动清理。 /> 而使用“While”,你必须自己做,初始化 - 在“While”之外,清理 - 只有当你离开可见性时你的变量(条件)被声明。

  2. “For”具有方便的语法(以及之后的所有清理),用于对集合和数组进行迭代。

  3. 你的代码我会用这种方式重写:

    import acm.program.*;
    
    public class DigitSum extends ConsoleProgram{  
    public void run() {
         println("this program sums the digits in an integer");
         for(int n = readInt("enter a positive number: "), dsum = 0; n > 0; n /=10) {
             dsum += n % 10;
         }
        }
       }
    

    不要忘记 - 在init中可以为多个变量进行声明/初始化

答案 5 :(得分:0)

这应该有效。用此替换while循环。只需将初始化部分留空即可。

    for(;n>0;n=n/10)
    {
        dsum+=n%10;
    }

答案 6 :(得分:0)

无论如何,你有什么样的困难

int n = readInt("enter a positive number: ");
for(n;n>0;n=n/10)
{dsum+=n%10;
}