9

我理解一个根据情况比另一个具有某些优势的概念,但是它们在每种情况下都可以互换吗?我的教科书写道

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;
     }
    }
   }
4

7 回答 7

9
int dsum = 0;
for(int n = readInt("enter a positive number: "); n > 0; n /=10) {
   dsum += n % 10;
 }
于 2013-01-17T07:05:58.037 回答
5

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

你的 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。这只是从我给出的解释中得出的。

于 2013-01-17T07:09:50.597 回答
3

除了在初始化程序中声明的变量范围之外,还有另一个时候 afor会表现出不同的行为,那就是存在 a continue

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

不等于_

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

因为在while循环中continue它会跳过update,而for循环不会。

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

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

// loops forever
int xa=0;
while(xa<10) { continue; xa++; }
于 2013-05-10T00:55:56.280 回答
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);
}
于 2013-01-17T07:11:46.533 回答
1

是的,除了以下两点:

  1. “For”让您在其中声明和初始化您的条件(= 变量,顺便说一句 - 多个变量!),然后在您离开“For”循环时自动清理它。
    而对于“While”,您必须自己进行初始化——在“While”之外进行清理——只有当你离开声明变量(用于条件)的可见性时。

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

你的代码我会这样重写:

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 中,您可以为多个变量放置声明/初始化

于 2013-01-17T07:12:52.853 回答
0

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

    for(;n>0;n=n/10)
    {
        dsum+=n%10;
    }
于 2013-01-17T07:07:04.213 回答
0

反正你有什么困难

int n = readInt("enter a positive number: ");
for(n;n>0;n=n/10)
{dsum+=n%10;
}
于 2013-01-17T07:10:02.960 回答