2

我无法弄清楚为什么for loop尽管有while loop. 在我看来,即使有人说while loop当我们不知道迭代次数时使用它,它们也是一样的。在那种情况下,我们也可以使用for loop,不是吗?

例如,

对于循环:

for (;true;)
{
    document.write("Hello World <br>");
    if(somecondition){
       break;
    }
}

While循环:

while (true)
{
    document.write("Hello World <br>");
    if(somecondition){
       break;
    }
}

而且,两种循环的复杂度是相等的。那么,为什么循环不被删除而只剩下一种呢?

4

5 回答 5

3

简短的回答:它们都是语法糖,使程序员而不是机器更容易解释代码。

您给出的任何一种方法都不比另一种更有效,而且每个 for 循环都可以写成 while 循环。不同之处在于它使其他程序员更具可读性。

让我们以 Python 为例:

for line in file.readline():

我不需要在这段代码中看到任何其他内容来了解​​它的意图。它正在读取一个文件,如本例所示:

readline = file.readline()
while readline != "":
    # some code
    readline = file.readline()

目前还不清楚发生了什么,但意图就在那里。最糟糕的是:

while true:
    readline = file.readline()
    if readline == "":
        break

我现在需要进一步阅读循环以获得相同的洞察力。如上所述,while 循环和 for 循环为程序员提供了使代码更具可读性和可维护性的方法。

于 2013-06-24T12:25:42.927 回答
2

事实上,任何你可以用for循环做的事情也可以用循环来完成while。以下两个是等价的:

for (initialCondition; test; nextStep) {
  doSomething;
}

initialCondition;
while (test) {
  doSomething;
  nextStep;
}

那么为什么我们有for循环呢?有两个原因。

首先,第二个代码片段中的模式非常常见(初始化一些东西,然后在每一步更新的同时循环,直到条件失败)。因为它很常见,所以许多语言设计者认为为它提供一种特殊的语法是值得的。

其次,将迭代变量(例如ior j)移出循环体并移入循环体for使编译器和解释器更容易检测某些类别的错误(甚至可能禁止它们)。例如,如果我写(在 MATLAB 中,因为我碰巧打开了它)

for i = 1:10
  i = i + 5;   // The body of
  disp(i);     // the loop.
end

然后 MATLAB 给我一个警告 - "Line 2: Loop index 'i' is changing inside a FOR loop"。如果我把它写成一个while循环:

i = 1;
while i <= 10
  i = i + 5;   // The body of
  disp(i);     // the loop.
  i = i + 1;
end

哦哦!我不仅不再收到来自 MATLAB 的警告,而且现在我的代码不正确!修改循环体中的迭代变量是危险的,而且很少有你打算这样做的情况。将“初始化、测试、更新”循环编写为for循环而不是while循环有助于保护您免受此类错误的影响。

于 2013-06-24T12:52:32.123 回答
1

你是对的,for循环可以转换为while循环,反之亦然。您甚至可以将它们转换为 do-while 循环。

if和相同switch。如果也可以使用 if 来完成相同的操作,为什么还要进行 switch 呢?

我想它主要是出于可读性和维护性的原因而存在的。考虑以下代码:

int i=0;
while(i < array.length){
    doStuff(array[i]);
    i++;
}

现在,另一位开发人员围绕这个循环添加了功能:

int i=0;
do();
some();
i = other(); // oops, didn't see that i was used for the loop
stuff();
while(i < array.length){
    doStuff(array[i]);
    i++;
    doMoreStuff(array[i]); // oops, did't see i was already incremented
}

for(int i=0; i<array.length; i++){
    doStuff(array[i]);
    doMoreStuff(array[i]);
}
  • 它更易于阅读(您知道循环何时开始以及何时结束)
  • 它更容易出错(i仅限于 for 循环)
  • 因此,更容易维护
于 2013-06-24T12:31:52.183 回答
1

是的,我认为你不需要它们:

Label1:
document.write("Hello World <br>");
if(somecondition) goto Label2;
goto Label1;

Label2:
于 2013-06-24T12:38:12.227 回答
1

它们在语义上是等价的。for(x;y;z) { foo; }相当于x; while (y) { foo; z; }。它们在标准的其他版本中并不完全等价,在for 块for (int x = 0; y; z),的范围示例中,循环结束后超出范围,而循环结束后仍在范围内。xint x; while (y) x

另一个区别是 for 将缺少的 y 解释为 TRUE,而 while 必须提供一个表达式。for (;;) { foo; }很好,但while() { foo; }不是。

资源

作者

于 2013-06-24T12:27:28.363 回答