Бесконечные петли в плохой форме? - PullRequest
7 голосов
/ 03 июня 2009

Итак, у меня есть код C ++ для узлов обратного отслеживания в алгоритме BFS. Это выглядит примерно так:

typedef std::map<int> MapType;
bool IsValuePresent(const MapType& myMap, int beginVal, int searchVal)
{
    int current_val = beginVal;
    while (true)
    {
        if (current_val == searchVal)
            return true;

        MapType::iterator it = myMap.find(current_val);
        assert(current_val != myMap.end());
        if (current_val == it->second) // end of the line
            return false;
        current_val = it->second;
    }
}

Однако, while (true) кажется ... мне подозрительным. Я знаю, что этот код работает, и логически я знаю, что он должен работать. Однако я не могу избавиться от ощущения, что в while должно быть какое-то условие, но на самом деле единственно возможное - это использовать переменную bool, просто чтобы сказать, выполнено ли это. Должен ли я перестать беспокоиться? Или это действительно плохая форма.

EDIT : Спасибо всем, кто заметил, что есть способ обойти это. Однако я все еще хотел бы знать, есть ли другие действительные случаи.

Ответы [ 12 ]

0 голосов
/ 03 июня 2009

Хватит беспокоиться. Это неплохая форма, если она помогает упростить логику кода и улучшить удобство обслуживания и читаемость. Стоит, однако, документировать в комментариях информацию об ожидаемых условиях выхода и о том, почему алгоритм не соскользнет в бесконечный цикл.

0 голосов
/ 03 июня 2009

Ну, комментарий о том, что на самом деле это не бесконечный цикл, поможет:

    while (true) // Not really an infinite loop! Guaranteed to return.

Я согласен, что у него должно быть условие, но в некоторых ситуациях это нормально (и не всегда возможно или легко создать условие).

...