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

时间:2012-11-13 18:12:21

标签: c++ c for-loop

  

可能重复:
  No loop condition in for and while loop

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

for (;;)

编译好。为什么这个空表达式求值为true,但以下

if () {}
while () {}

都会失败吗?我想知道 if / why for-loop是这种情况的例外。

2 个答案:

答案 0 :(得分:8)

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

这些是迭代语句

  

while(表达式)语句

     

做语句while(表达式);

     

for(expression [opt]; expression [opt]; expression [opt])statement

     

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

while循环用于评估控制表达式每次执行循环之前,而do循环用于评估每次执行后

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

  

6.8.5.3 for语句

     

声明

     

for(clause-1; expression-2; expression-3)statement

     

表现如下:   表达式表达式-2是控制表达式   在每次执行循环体之前进行评估。表达方式   在每次执行之后,expression-3被计算为void表达式   循环体。如果第1条是声明,则是任何范围   它声明的标识符是声明的剩余部分和   整个循环,包括其他两个表达式;它达到了   在第一次评估控制之前执行的顺序   表达。如果clause-1是表达式,则将其计算为void   在控制表达式的第一次评估之前的表达。

     

可以省略子句-1和表达式-3。省略了   expression-2被非零常量替换。

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

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

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

编写和理解比用循环外声明的变量写一个while(1)循环然后在循环内增加更简单。

for循环规范然后继续允许你省略子句-1,以便你可以在其他地方声明或初始化变量,并且你可以省略表达式-3,这样你就不需要在每个循环完成时评估任何表达式

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

答案 1 :(得分:4)

我无法给出确定的答案,但我的猜测是因为在for循环的情况下,有三种不同的表达式,每种表达式可能需要也可能不需要使用,具体取决于循环。

if案例中,如果没有表达则没有任何意义;它需要始终表现为表达式是真还是假,因此仅相当于其中一个条款。在while案例中,会对while () { }进行有意义的解释,即评估为while (1) { }(为您提供一个可以突破break的循环),但我认为遗漏那个单一角色的好处不值得麻烦。

但是,在for循环的情况下,有三种不同的表达式,每种表达式可能需要也可能不需要。例如,如果你想在每个循环上初始化和增加某些东西,但是会使用break来摆脱循环,你可以编写for (i = 0; ; ++i),或者如果你只想要测试和增量,因为您的变量已初始化,您可以编写for (; i > 0; --i)。根据你的循环,这些表达式中的每一个都可能不是必需的,让你为所有你不使用的东西填写占位符似乎有点麻烦;为了保持一致性,而不是在其中一个中要求占位符,所有这些都是可选的,如果省略,条件被认为是一个常量非零值。

当然,有时很容易在设计决策中阅读过多的意图。有时,给定标准的原因仅仅是它在第一个实现中的实现方式,而其他人只是复制了它。有关示例,请参阅Rob Pike's explanation,了解为什么以.开头的文件隐藏在Unix中;这不是因为经过深思熟虑的设计决定,而是因为有人在编写ls时采用了快捷方式,并且不想每次都显示...目录条目。 / p>