为什么for循环的条件可以为空

Why can the condition of a for-loop be left empty?

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

可能重复:
for和while循环中没有循环条件

为什么允许for-loop中的条件为空?例如

for (;;)

编译良好。为什么这个空表达式的计算结果是true,而下面的

if () {}
while () {}

两者都会失败吗?我想知道是否/为什么for-loop是这种情况的例外。

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

这些是迭代语句

while(expression)语句

do语句while(表达式);

for(expression[opt];expression[pti];express[opt])语句

for(声明表达式[opt];表达式[opt])语句

while循环设计为在每次执行循环之前评估控制表达式,do循环设计为每次执行之后评估

for循环被设计为一个更复杂的迭代语句。

6.8.5.3针对语句的

声明

for(第1条;表达式2;表达式3)语句

行为如下:表达式表达式-2是控制表达式在每次执行循环体之前进行评估。表达式表达式-3在每次执行环形体。如果第1条是声明,则任何它声明的身份是声明的剩余部分整个循环,包括其他两个表达式;它在控制权首次评估前的执行顺序表示如果第1条是表达式,则将其计算为void第一次评估对照表达之前的表达。

第1条和第3条都可以省略。省略的表达式-2被非零常数代替。

该规范允许省略表达式-2,即循环的条件,并用非零常数代替。这意味着for循环将无限期地继续执行。

这对于允许使用简单的语法进行无休止的迭代非常有用。

for(int i = 0;;i++) { //do stuff with i }

这比编写while(1)循环要简单得多,该循环在循环外声明一个变量,然后在循环内递增。

for循环规范允许您省略第1条,以便您可以在其他地方声明或初始化变量,还可以省略表达式3,以便在每个循环完成时不需要计算任何表达式。

for循环是一种特殊情况。while循环和do循环是严格的,需要一个表达式,但for循环是一个灵活的迭代语句。

我不能给出一个明确的答案,但我的猜测是,这是因为在for循环的情况下,有三个不同的表达式,根据循环的不同,每个表达式可能需要使用,也可能不需要使用。

if的情况下,如果没有表达,那就没有意义;它需要始终表现得好像表达式是真是假,因此仅相当于其中一个子句。在while的情况下,对while () { }会有一个有意义的解释,那就是对while (1) { }求值(给你一个可以用break打破的循环),但我想去掉那个单个字符的好处不值得麻烦。

然而,在for循环的情况下,有三个不同的表达式,每个表达式可能需要,也可能不需要。例如,如果你想在每个循环中初始化和递增一些东西,但要使用break来突破循环,你可以写for (i = 0; ; ++i),或者如果你只想测试和递增,因为你的变量已经初始化,你可以编写for (; i > 0; --i)。考虑到根据你的循环,这些表达式中的每一个可能都不是必要的,让你为所有不使用的内容填充一个占位符似乎有点麻烦;为了一致性,不需要在其中一个中使用占位符,而是所有这些都是可选的,如果省略,则条件被视为常量非零值。

当然,有时很容易在设计决策中解读出太多的意图。有时,给定标准的原因很简单,因为它在第一次实现中就是这样实现的,而其他人只是复制了它。例如,请参阅Rob Pike对为什么以.开头的文件隐藏在Unix中的解释;这并不是因为经过深思熟虑的设计决定,而是因为有人在编写ls时走了捷径,不想每次都显示...目录条目。