我目前正在使用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”循环只是为了语义和可读性?
答案 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;循环只是为了语义和可读性?
我认为你的想法不会是不利的,是的,while
和for
被选择用于语义/可读性(甚至是历史原因)。然后,每种语言的含义都略有不同。通常,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
循环,它没有控制变量(没有意义打破循环!)。
另一方面,while
,repeat
,do ... 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...
普通的while
,while (true)
和do-while
循环将成为:
cycle when (condition); BODY // while
cycle BODY; // while (true)
cycle BODY; when (condition) // do-while
想一想......: - )
答案 2 :(得分:0)
由于历史原因和熟悉程度,大多数语言都有for
和while
。熟悉很重要:如果您重复使用与其他语言相同的概念和关键字,您的语言将更容易学习。许多语言使用“!”因为这个原因的否定(许多其他语言使用“不”)。查看此页面比较不同语言的语法,您会看到许多相似之处: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)
}
因此,正如您所看到的,完全可以为所有循环使用单个关键字。
同时拥有for
和while
的主要原因是熟悉性和可读性。但你可以很容易地做到。