为什么for-loop
中的条件允许为空?例如
for (;;)
编译好。为什么这个空表达式求值为true
,但以下
if () {}
while () {}
都会失败吗?我想知道 if / why for-loop
是这种情况的例外。
答案 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>