为什么 for 循环的条件是可选的,而 while 循环不是?

Why is a for loop's condition optional, but a while loop's isn't?

本文关键字:循环 while for 条件 为什么      更新时间:2023-10-16

为什么for(;;)被视为无限循环,而while()却给出错误,因为它需要一个表达式?为什么for循环也不期望表达式?

它只是... 不会。

while本可以允许空条件(大概会被解释为true),但这样它就会与if不对称,这对这不太有意义。

最终,没有令人信服的理由允许在while序言中使用空条件,因为任何使用它的代码都不会是自我记录的。

对于与for的对称性,您可能需要for(; true; )- 除了现在这看起来很奇怪,因为声明和更新子句现在可能是空的,而条件不能。好吧,让我们也强制要求这些。那么,我们在那些地方放了什么来做无操作呢?for (int dummy = 0; true; (void)dummy)?现在它变得越来越愚蠢。

它们是不同的语言功能,没有充分的理由让它们在这方面以相同的方式工作,而牺牲其他考虑因素。

免责声明:这个答案解释了为什么语法是有效的,而不是为什么它是这样设计的。

根据文档(强调我的):

正式语法:

attr(可选) for ( 初始化语句条件(可选) ;iteration_expression(可选)) 语句

所以所需要的只是init-statement;.对于init-statement,它说:

表达式语句(可以是空语句 ";">)

因此,如果您放弃可选内容并为 init 语句放置一个;,则得到的只是;;

在 C 中,它有点不同:

为 ( init_clause ; cond_expression ; iteration_expression ) loop_statement

init_clause、cond_expression和iteration_expression都是可选的

这是两个;和三个可选子句/表达式。如果省略所有三个,则会再次;;

这是一个语言设计问题,所以语言设计师应该插话。 我的观点:一种语言的可选功能(特别是快捷方式)应该 防止错误。 所以,while() 很容易是一个错误(你省略了条件,例如 0 或 1),而 for(;;) 很少是一个错误(你必须有意识地键入 2 ;)。