这段c ++代码在做什么?

时间:2009-08-03 16:04:25

标签: c++ seqan

我不知道这段代码的工作方式和原因:

// 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-loop?
  2. 为什么for循环没有初始化?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:4)

显然,goDowngoNext正在通过引用并改变它来进行论证。因此,您的两个问题的答案是:1 while调用goDown多次,改变myIterator,这就是您所谈论的间接影响,从2. for开头myIteratorwhile完全一样 - 所以当然它不会重新分配它,这会撤消所有的工作!