Что делает этот кусок кода C ++? - PullRequest
1 голос
/ 03 августа 2009

Я не знаю, как и почему этот кусок кода работает:

// 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. Как время может повлиять на цикл for?
  2. Почему цикл for не инициализирован?

Ответы [ 2 ]

18 голосов
/ 03 августа 2009

Вы столкнулись с забавными частями C ++ - используя языковые конструкции в синтаксически правильных, но трудных для человека методах анализа.

while (goDown(myIterator));

Это будет "goDown (myIterator)", пока не вернется false. Затем он продолжит цикл. Это ничего не делает, но это нормально, потому что функция goDown делает работу.

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

Это ничего не инициализирует, но проверяет, что это не atEnd (myIterator) - пока это не так, оно будет идти далее (myIterator). Его также можно записать как цикл while, чтобы его было легче понять:

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

Так код будет:

  1. Вниз, пока goDown () не вернет false - это означает, что goDown каждый раз модифицирует myIterator
  2. goNext (), пока не будет в конце ()
4 голосов
/ 03 августа 2009

Очевидно, goDown и goNext берут свои аргументы по ссылке и изменяют их. Итак, ответ на два ваших вопроса: 1. while звонит goDown несколько раз, изменяя myIterator, как это происходит, и это косвенное влияние, о котором вы говорите, начиная с 2. for начинается с myIterator точно так же, как while оставил его - поэтому, конечно, он не переназначает его, что отменит всю работу в то время как!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...