这种for循环有什么理由吗?

时间:2016-05-20 07:50:11

标签: c for-loop syntax

有没有理由在c中写这样的for-loop? (第一个语句保留为空,高度设置在外部而不是......并且高度变量在此之后也不会被使用)

lastheight = halfheight;
.
. // some more code changing height, includes setting 
. // lastheight
. // to something that is essentially the height of a wall
.
height = halfheight;
for ( ; lastheight < height ; lastheight++)

引自Wolfenstein3D source code

2 个答案:

答案 0 :(得分:5)

只要您对for循环语法感到困扰,

 for ( ; lastheight < height ; lastheight++)
只要先前定义并初始化lastheight

就完全有效。

引用C11,章节§6.8.5.3

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

[...] 子句-1 表达式-3 都可以省略。省略的表达式-2 由a替换   非零常数。

关于在lastheight循环之外定义for原因,可以提到一件事,对于像

这样的构造
 for ( int lastheight = 0 ; lastheight < height ; lastheight++)  {...} //C99 and above

lastheight范围限制为for循环体。如果您希望在(在范围之外)循环体之后使用,则必须在循环之外使用定义。

另外,如果我的记忆正确,在C99之前,无论如何都无法在lastheight语句中声明变量。所以,要走的路是

for

此外,here's a link to a detailed discussion about for loop syntax.

免责声明:我的回答

答案 1 :(得分:1)

写作:

height = halfheight;
for ( ; lastheight < height ; lastheight++)

与:

完全相同
for ( lastheight = halfheight; lastheight < height ; lastheight++)

作为lastheight = halfheight;,您的初始语句将在循环之前执行一次。

通常,for循环具有以下结构:

for (part1; part2; part3) {
    ....
}
  • 第1部分是在循环开始之前执行一次的语句。执行完成后,您将进入循环并开始执行其语句。该部分主要用于对循环有用的初始化。如果你把它留空,你就不会在循环之前做任何动作。
  • 第2部分是您在每次迭代时检查的条件
  • 第3部分是在每次迭代结束时e xecuted的声明
  在其他地方

之后不使用

高度变量

这不完全正确。实际上,它在每次迭代的开头使用,因为for循环的第二部分在每次迭代开始时被计算,并且只有在条件{{时才执行循环1}}是真的。