1

我不知道这段代码如何以及为什么起作用:

// postorder dfs
Iterator< Index<String<char> >, TopDown<ParentLink<Postorder> > >::Type
     myIterator(myIndex);
while (goDown(myIterator));
for (; !atEnd(myIterator); goNext(myIterator)) 
// do something with myIterator ( Traverse Through (Suffix)-tree )

这是seqan的一个例子,接口在这里描述:API

  1. while 如何影响 for 循环?
  2. 为什么for循环没有初始化?
4

2 回答 2

18

您已经遇到了 C++ 中有趣的部分——在语法上有效但人类难以解析的技术中使用语言结构。

while (goDown(myIterator));

这将“goDown(myIterator)”直到它返回 false。然后它将继续进入 for 循环。它什么都没有循环——但这没关系,因为函数 goDown 正在工作。

for (; !atEnd(myIterator); goNext(myIterator)) 

这不会初始化任何东西,但会测试它不是 atEnd(myIterator) - 虽然它不是,但它会 goNext(myIterator)。它也可以写成一个while循环,使它更容易理解:

while(!atEnd(myIterator)) 
{
    goNext(myIterator));
}

所以代码将:

  1. 向下直到 goDown() 返回 false - 这意味着 goDown 每次都在修改 myIterator
  2. goNext() 直到 atEnd()
于 2009-08-03T16:09:11.380 回答
4

显然,goDown并且goNext正在通过引用和更改他们的论点。因此,您的两个问题的答案是,1.while呼叫goDown数次,myIterator随着时间的推移而变化,这就是您所说的间接影响,因为 2.for开头与左侧myIterator完全相同while- 所以当然它不会重新分配它,那会撤消所有的工作!

于 2009-08-03T16:09:35.780 回答