【问题标题】:While loops and for loopsWhile 循环和 for 循环
【发布时间】:2013-12-12 18:38:55
【问题描述】:

一般来说,while 循环不只是 for 循环的改写:

for( starting point; condition; excution code){}
//and while
starting point;
while(condition)
{excution code;
 }

如果这似乎是一个愚蠢的问题,我真的很抱歉。但我只是想知道是否存在使用 while 比 for 更好的情况。反之亦然。

【问题讨论】:

    标签: loops for-loop while-loop programming-languages


    【解决方案1】:

    所有 for 循环都可以重写为 while 循环,反之亦然。区别在于程序员的意图:您是否在重复某件事条件为真? ..或者你是从一个东西迭代到另一个东西?

    【讨论】:

    • 我不太确定每个 for 循环都可以转换为 每种语言 中的 while 循环。 FORTRAN 样式 DO I=1,100 样式循环浮现在脑海中。 OTOH,FORTRAN 以前甚至没有 while 循环,对吗?
    • while 只是一个美化的if + goto wink。从技术上讲,您认为 F77 没有 while.. 是正确的;-)
    【解决方案2】:

    不,事实并非如此。两个循环都有不同的用途。 While 循环通常在迭代次数不定的情况下使用,而 for 循环在迭代次数更确定的情况下使用。但是您可以将一个转换为另一个(尽管我不建议这样做)

    还有一个重要方面是,在 for 循环中,迭代器的范围被设置为恰好在 for 循环内。

    但我只是想知道是否存在使用 while 比 for 更好的情况。

    我更喜欢或选择for 而不是while,因为它更具可读性(尽管有些人可能认为后者更具可读性。)而且也是因为迭代器范围的原因。

    同样就相似性而言,while循环类似于:

    while (condition) 
    {
       statements;
    }
    

    类似于

    if (condition) 
    {
       do 
       {
          statements;
       } while (condition);
    }
    

    当您不想使用任何计数器并且您的唯一动机是完成条件时,您也可以使用 while。

    【讨论】:

    • 虽然是很好的做法,但我看不出迭代器范围是如何被强制到循环内部的:例如int i=0; for (;i<10;i++) {}
    • @fvu:- 是的,这是正确的,我知道这是可以做到的,但我认为这不是一个很好的做法。另外我的观点是,我们设法将 i 保持在循环的范围内,而不是让它逃逸到代码的其余部分。
    • 啊,好吧,你的意思是(好的)程序员可以强制执行范围,而不是语言或编译器会强制执行它。谢谢你的澄清。
    • 这是否也适用于 C 中的 goto 循环。我听说使用它不好
    • @user689:- 实际上 goto 被认为是不好的,因为它会产生难以理解的意大利面条代码。
    【解决方案3】:

    你是对的。每个 for 循环都可以重写为 while 循环,反之亦然。然而,就代码可读性而言,每个循环都有其优点和缺点。

    通常,如果您需要在循环中增加一个变量直到达到某个条件,您会使用 for 循环。

    打印数组

    for(int i = 0; i < array.length; i++) {
        print("Element " + i + ": " + array[i]);
    }
    

    如果你只是在等待一个条件,你会更喜欢一个 while 循环:

    从流中读取

    while((String line = buffer.readLine()) != null) {
        print("Next line: " + line);
    }
    

    虽然在语义上相等,但我不想看到那些循环:

    打印数组

    int i = 0;
    while(i < array.length) {
        print("Element " + i + ": " + array[i]);
        i++;
    }
    

    从流中读取

    for(String line = buffer.readLine(); line != null; line = buffer.readLine()) {
        print("Next line: " + line);
    } 
    

    【讨论】:

      【解决方案4】:

      目的是使用 for 循环进行固定次数的迭代,而使用 while 循环进行不定次数的迭代。

      事实上,正如您所料,可以将每个 for 循环写成一个预先初始化的 while 循环。 (但在大多数语言中,反之亦然。)

      就我个人而言,我倾向于使用 while 循环,除非我正在迭代一个数组或字符串,如果知道大小的话。

      还要注意,在 Java 中,有一种形式的 for 循环,如下所示:

       for (E elem : collection) { ... }
      

      它会遍历 E 类型元素的可迭代集合。这是一件非常好的事情,非常直观,而且它可以防止您因一个错误或重新初始化错误而提交。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-01
        • 1970-01-01
        • 2014-03-15
        • 2019-11-10
        • 1970-01-01
        • 1970-01-01
        • 2021-03-27
        相关资源
        最近更新 更多