【问题标题】:Is there some reason for this kind of for-loop?这种for循环有什么原因吗?
【发布时间】:2016-09-17 09:10:47
【问题描述】:

有什么理由在 c 中编写这样的 for 循环吗? (第一个语句留空,而将高度设置在外部......并且在此之后也不会在其他地方使用该高度变量)

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

【问题讨论】:

  • 这是一条红鲱鱼。第一行与第二行无关。真正重要的是halfheight 循环变量是否仍在循环外使用。就目前而言,仅对循环变量使用 for 标头的约定似乎足够明智。
  • @KerrekSB 并添加 lastheight 初始化。
  • 要回答为什么循环变量 (lastheight) 没有在 for 循环中初始化的问题,您需要提供足够的上下文(即初始化 lastheight 的代码)。正如现在所说,这个问题是无稽之谈。
  • @mgear 不,请仔细阅读代码。如果您愿意,“循环变量”是lastheight,它不会在您引用的两行代码中初始化。所以你没有显示相关部分
  • @KlasLindbäck 点是,wolfenstein3d 在此之前有一个 if/else 子句;我将为此引入一个“虚拟”值以使其有意义

标签: c for-loop syntax


【解决方案1】:

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

 for ( ; lastheight < height ; lastheight++)

完全有效,只要 lastheight 之前已定义和初始化。

引用C11,第 6.8.5.3 章

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

[...] clause-1expression-3 都可以省略。省略的 expression-2 被替换为 非零常数。


关于在for 循环之外定义lastheight原因,可以提到一件事,即对于像这样的构造

 for ( int lastheight = 0 ; lastheight < height ; lastheight++)  {...} //C99 and above

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

另外,如果我没记错的话,在 C99 之前,无论如何都不能在 for 语句中声明变量。所以,要走的路是

 int lastheight;
 for ( lastheight = 0 ; lastheight < height ; lastheight++)  {...}

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

免责声明:我的回答

【讨论】:

  • 在 C99 之前,声明不仅不能出现在 for 标头中,而且还必须出现在任何其他非声明语句之前。那是黑暗的日子:-)
【解决方案2】:

写作:

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

完全一样:

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

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


一般来说,for循环的结构如下:

for (part1; part2; part3) {
    ....
}
  • 第 1 部分是在循环开始之前执行一次的语句。在它执行之后,你进入循环并且它的语句开始执行。这部分主要用于对循环有用的初始化。如果将其留空,则在循环之前不执行任何操作。
  • 第 2 部分您在每次迭代中检查的条件
  • 第 3 部分是在每次迭代结束时执行的语句。

在此之后其他地方也不会使用高度变量

这并不完全正确。实际上,它在每次迭代开始时使用,因为 for 循环的第二部分在每次迭代开始时被评估,并且只有当条件 lastheight &lt; height 为真的。

【讨论】:

  • ;; 部分是什么?
  • @SouravGhosh 我不小心多加了一个;,谢谢。
  • for 循环的第一部分通常用于循环变量初始化。本例中的循环变量是lastheight,而不是height
  • @KlasLindbäck 这是通常的情况,但实际上for 循环的第一部分可以包含将执行一次的any 语句, 在循环之前。
  • 你可以,但这只会让下一个阅读代码的人感到困惑。
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多