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

Mar*_*lon 4 c c++ for-loop

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

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

for (;;)
Run Code Online (Sandbox Code Playgroud)

编译好.为什么这个空表达式会评估为true以下内容

if () {}
while () {}
Run Code Online (Sandbox Code Playgroud)

会失败吗?我想知道是否/为什么for-loop是一个例外.

spe*_*pex 9

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

这些是迭代语句

而(表达)陈述

做声明而(表达);

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

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

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

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

6.8.5.3 for语句

该声明

for(clause-1; expression-2; expression-3)语句

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

可以省略子句-1和表达式3.省略的表达式-2由非零常量替换.

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

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

for(int i = 0;;i++) { //do stuff with i }
Run Code Online (Sandbox Code Playgroud)

编写和理解比使用在循环外声明的变量编写while(1)循环然后在循环内递增更简单.

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

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


Bri*_*ell 5

我无法给出明确的答案,但我的猜测是因为在for循环情况下,存在三种不同的表达式,根据循环,您可能需要或可能不需要使用每个表达式。

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

但是,在for循环情况下,存在三种不同的表达式,可能需要也可能不需要每种表达式。例如,如果您想在每个循环中初始化和递增某些内容,但将用于break中断循环,您可以编写for (i = 0; ; ++i),或者如果您只想要测试和递增,因为您的变量已经初始化,您可以编写for (; i > 0; --i). 鉴于根据您的循环,这些表达式中的每一个都可能不是必需的,让您为所有不使用的内容填充占位符似乎有点麻烦;并且为了一致性,而不是要求其中一个占位符,所有这些都是可选的,如果省略,则条件被认为是一个恒定的非零值。

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