为什么不将“for”和“while”循环组合成一个循环?

时间:2017-01-20 13:23:42

标签: loops programming-languages language-design

我目前正在使用Ruby创建自己的编程语言,并想知道为什么有一个“while”和“for”循环是如此普遍。为什么只有一个“循环”关键字是不好的?

离)

loop (True) # acts as a while loop with a condition

loop var in 1..20 # acts as a for loop

loop var in list # acts as a for each loop

这在某种程度上是不利的,还是“while”和“for”循环只是为了语义和可读性?

3 个答案:

答案 0 :(得分:2)

事实上,还有更多的循环变体。例如do-while。

回答你的问题: 是的,所有这些都可以用来做同样的事情。但是,根据您使用的循环变量,您可以隐式地说出此循环的作用。

例如,如果您知道循环的频率,则只使用for循环(例如,对于列表中的每个项目(我知道,还有许多语言的foreach))。在for-loop中修改循环变量被认为是坏习惯。

因此,如果您不确定循环的频率,那么您最有可能使用的不是for-loop ...例如while循环。

以下是一些简单的代码示例:

for(i = 0; i < someList.Length; i++) {
  // do some stuff x times
}

while(someValue < someOtherValue) {
  someValue = someValue * someValue;
}

对我来说很明显,我不应该为第二个循环使用for循环。

总结:是的,你只需要一个循环结构。但是,我个人(!)喜欢通过选择哪个循环来实际说些什么。

答案 1 :(得分:2)

  

这在某种程度上是不利的,还是&#34;而#34; &#34; for&#34;循环只是为了语义和可读性?

我认为你的想法不会是不利的,是的,whilefor被选择用于语义/可读性(甚至是历史原因)。然后,每种语言的含义都略有不同。通常,for循环意味着您有一个控制变量。来自经典的基本

for i=1 to 10 ... (next i)
对于pascal来说,即使是来自python的更高级的构造(迭代器),这个想法也得到了尊重。此外,在某些语言中(例如,pascal),for意味着预先计算了低 - 高限制。这个pascal代码例如:

B := 5;
for i := 1 to B do begin
  B := 25
end;

可以发出警告或错误,或者即使在循环体中修改了上限,也可能导致5次迭代。 C语言也有for,完全不同,即使&#34;控制变量&#34;的一般概念也是如此。 99%的案件都受到尊重。 C for不预先计算限制(按设计),可以有多个控制变量,甚至根本没有:

for ( ; ; ) ...

是一个有效的for循环,它没有控制变量(没有意义打破循环!)。

另一方面,whilerepeatdo ... while等在语义上是清晰的(你可以&#34;用你的声音说话&#34;代码,以及一切是自我解释),并不暗示变量(它们暗示什么都没有)。

上述循环都有一个共同的问题:它们有一个测试,它在每次迭代的开始(或结束)执行。假设您要从标准输入中读取字符,对它们执行某些操作,并在此字符为EOF时停止。 C方式是:

while ( ( ch=getchar() ) != EOF) ... ; // do something with ch

C语言可以这样做,因为赋值也是一个表达式。如果不是这样,那就得写:

ch=getchar();
while (ch != EOF) {
  .... ; // do something with ch
  ch = getchar();
}
// I must use two times the statement "ch = getchar();"

// or...

do {
  ch = getchar();
  if (ch == EOF) break;
  ... ; // do something with ch
} while (true)
// I use getchar() only once, but I end up with an awful "while (true)"

用你的新语言,你可以发明一个不同的循环,如下所示:

cycle
  // statements always executed at least once
when (condition)
  // statement executed if the condition is true
  // and, if true, the cycle restarts
end

使用此语法,关于getchar()的示例将变为:

cycle ch=getchar(); when (ch != EOF) ... ; // do something bla bla bla...

普通的whilewhile (true)do-while循环将成为:

cycle when (condition);  BODY  // while
cycle BODY;                    // while (true)
cycle BODY; when (condition)   // do-while

想一想......: - )

答案 2 :(得分:0)

由于历史原因和熟悉程度,大多数语言都有forwhile。熟悉很重要:如果您重复使用与其他语言相同的概念和关键字,您的语言将更容易学习。许多语言使用“!”因为这个原因的否定(许多其他语言使用“不”)。查看此页面比较不同语言的语法,您会看到许多相似之处:http://rigaux.org/language-study/syntax-across-languages.html

现在,回答你的问题。虽然大多数语言都使用while关键字,但您确实不需要它。

我能想到的最好的例子是Go:

// C-like for
for i := 0; i < 10; i++ {
    sum += i
}

// while
for sum < 1000 {
    sum += sum
}

// infinite loop
for {
}

// do .. while
for ok := true; ok; ok = condition {
  ...
}

// range-for
for i, v := range pow {
    fmt.Printf("2**%d = %d\n", i, v)
}    

因此,正如您所看到的,完全可以为所有循环使用单个关键字。

同时拥有forwhile的主要原因是熟悉性和可读性。但你可以很容易地做到。