何时使用while循环而不是for循环?

13

我正在学习Java和Android。几乎所有可以使用while循环完成的任务都可以使用for循环完成。

我发现只有在一个简单的情况下,使用while循环比for循环更好。

如果我需要在程序中使用计数器的值,那么我认为使用while循环比for循环更好。

使用while循环

int counter = 0;
while (counter < 10) {
    //do some task
    if(some condition){
        break;
    }
}
useTheCounter(counter); // method which use that value of counter do some other task

在这种情况下,我发现while循环比for循环更好,因为如果要在for循环中实现相同的结果,我必须将计数器的值分配给另一个变量。

但是,在什么特定情况下while循环比for循环更好呢?


我只会执行 useTheCounter(10) - Tocco
15个回答

23
一个主要的区别是while循环适用于您不事先知道需要执行的迭代次数的情况。当您在进入循环之前就知道这一点时,您可以使用for循环。

3
你能给一个例子来支持你的回答吗? - Rashmi Ranjan mallick
2
通常从缓冲区逐行读取文件时,您会使用while循环(因为您不知道何时会出现文件结束标记)。 - Trevor

15

for循环只是一种特殊的while循环,它恰好处理变量的递增。你可以在任何语言中使用while循环来模拟一个for循环。这只是语法上的糖果(除了Python中for实际上是foreach)。因此,没有特定的情况一个比另一个更好(尽管出于可读性的原因,在进行简单递增循环时,应该优先选择for循环,因为大多数人可以轻松地看出发生了什么)。

for可以像while一样运作:

while(true)
{
}

for(;;)
{
}

而while可以像for一样使用:

int x = 0;
while(x < 10)
{
    x++;
}

for(x = 0; x < 10; x++)
{
}

在您的情况下,是的,您可以像这样将其重写为for循环:

int counter; // need to declare it here so useTheCounter can see it

for(counter = 0; counter < 10 && !some_condition; )
{
    //do some task
}

useTheCounter(counter);

1
实际上,计数器变量在for循环之外是不可访问的(除非你当然在它之外声明它)。 - ratchet freak
1
当使用增量时,whilefor并不完全相同 - 如果您还需要使用continue。使用while时,变量不会自动增加(除非进行额外的努力),但是使用for时会自动增加。 - Kevin Brock

8

forwhile是等价的,只是不同的语法表达同一个意思。


你可以将它转换为

while( condition ) {
   statement;
}

转换为:

for( ; condition ; ) {
    statement;
}

另一种方法:
for( init; condition; update) {
    statement;
}

等同于这个:

init;
while(condition) {
    statement;
    update;
}

所以,只需使用看起来更好或更容易说的选项。

3

记住:

所有用for循环实现的功能都可以用while循环实现,但并非所有while循环都可以用for循环实现。

WHILE :

while 循环在退出条件与循环次数或控制变量无关时使用。

FOR :

for 循环只是编写 while 循环的快捷方式,需要初始化语句、控制语句(何时停止)和迭代语句(每次迭代后对控制因素进行操作)。

例如:

基本上,for 循环只是 while 循环的简写,任何 for 循环都可以从以下代码进行转换:

for([initialize]; [control statement]; [iteration]) {
   // ...
  }

并且。
[initialize]; 
while([control statement]) { 
   //Do something [iteration];
   } 

是相同的。


忽略初始化和迭代步骤,for 循环将与 while 循环一样工作。 - Kien Truong

3
使用FOR循环来确定循环次数。技术术语称为迭代次数。如何确定迭代次数?您需要知道开始、结束和步长。如果您知道这三个信息,则应使用FOR循环,因为它是适合该任务的正确工具。
使用DO循环当您不知道迭代次数时。如果您不知道开始、结束、步长或某些组合,则需要使用DO循环。表达式将在循环顶部进行评估。 如果您希望至少循环一次,请使用DO WHILE循环。如果您不想至少循环一次,则仅使用WHILE循环。表达式将在循环底部进行评估。

2

for循环是有限的,因为当它遍历完所有元素后将停止循环...

while循环可以是无限的,如果条件不满足或者循环没有被打破。

编辑

我犯了错误... for循环也可以是无限的...


4
可以使用无限循环 for(;;) - Chris Eberle
for循环也可以是无限的:for (i = 1; i == i - 1; i++) { ... } - Tocco
如果你想要遍历一个集合中的所有元素,就使用 for,如果你想要尽早跳出循环,就使用 while 是相当明智的。 - K4emic
1
@K4emic:你可以以与while循环相同的方式跳出for循环。没有区别。 - Chris Eberle
@Chris 当然,我写了什么表明你不能这样做吗?我只是陈述了我认为区分循环集合的方式是合理的。 - K4emic
显示剩余2条评论

2

当你没有迭代器(通常是计数器)时,使用 while 循环通常更好。


1
你可以这样做:
int counter;
for (counter = 0; counter < 10; ) {
    //do some task
    if(some condition){
        break;
    }
}
useTheCounter(counter);

while循环能做的任何事情,for循环也能做到;而for循环能做的任何事情,while循环也能做到。


1
int counter = 0;
while (counter < 10) {
    //do some task
    if(some condition){
        break;
    }
}
useTheCounter(counter); // method which use that value of counter do some other task

你好,我重复了你的代码,因为它是不正确的。你忘记增加计数器,所以它将保持在0。

int counter = 0;
while (counter < 10) {
  //do some task
  if(some condition){
      break;
  }
  counter++;
}
useTheCounter(counter); // method which use that value of counter do some other task

1

我认为需要指出的一件事是,当您使用for循环时,不需要将计数器分配给另一个变量。例如for(counter = 0; counter<10; counter ++)是有效的Java代码。

至于你的问题,当你想让一段代码运行特定的次数时,for循环通常更好;而当代码块中有一个布尔标志只在满足特定条件时才被设置为true时,while循环更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接