为什么for(;;)
被视为无限循环,而while()
却由于需要表达式而产生错误?为什么for
循环也不要期望表达式?
答案 0 :(得分:10)
只是……不。
while
可以允许一个空条件(大概被解释为true
),但是它与if
不对称,因此意义不大
最终,没有令人信服的理由允许在while
序言中使用空条件,因为任何使用此条件的代码都不会自行记录。
对于与for
对称的情况,可以要求for(; true; )
—除非现在看起来很奇怪,因为声明和更新子句现在可能为空而条件不能为空。好的,我们也将其设为强制性。那么,我们要把那些地方放到什么地方去? for (int dummy = 0; true; (void)dummy)
?现在越来越傻了。
它们具有不同的语言功能,没有充分的理由使它们在这方面以相同的方式工作,而以其他考虑为代价。
答案 1 :(得分:1)
免责声明:此答案说明了为什么语法有效,而不是为什么这样设计。
根据documentation(强调我的意思):
形式语法:
attr(可选),用于(初始化语句条件(可选);迭代表达式(可选))语句
因此,只需要init-statement
和;
。对于init-statement
,它说:
一个表达式语句(可以是空语句“;” )
因此,如果您放弃了可选的内容并在初始化语句中放置了;
,那么您得到的仅仅是;;
。
在C中,这有点不同:
for(init_clause; cond_expression;迭代表达式) loop_statement
init_clause,cond_expression和eration_expression都是可选的
这是两个;
和三个可选的子句/表达式。如果省略全部三个,则再次得到;;
。
答案 2 :(得分:0)
这是一个语言设计问题,因此语言设计人员应注意。 我的意见:语言的可选功能(特别是快捷方式)应 预防错误。 因此,while()很容易出错(您省略了条件,例如0或1),而 for(;;)很少会犯错误(您必须有意识地键入2;)。