Когда это делать?

Когда вы делаете, в то время как лучший выбор по сравнению с другими типами циклов? Каковы некоторые распространенные сценарии, где его лучше, чем другие?

Я понимаю функцию do-while, но не когда ее использовать.

Ответ 1

Если вам нужно что-то сделать хотя бы один раз, но не знаю, сколько раз до начала цикла.

Ответ 2

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

do {
    //do something
} while ( condition );

Ответ 3

Никто еще не упомянул о его использовании в макросах C...

#define do_all(x) do{ foo(x); bar(x); baz(x); } while(0)

то в коде вы можете иметь

do_all(a);
  • точка состоит в том, что она выполняется только один раз, а полутолбатура в конце вызова макроса завершает while (0); выражение.

Ответ 4

Я использовал его раньше, если мне нужно реализовать множество условных проверок, например, обрабатывая входную форму в php. Вероятно, это не лучшая практика, но она более читаема, чем многие альтернативы:

do {
   if ( field1_is_invalid ) {
      $err_msg = "field1 is invalid"; break;
   }

   if ( field2_is_invalid ) {
      $err_msg = "field2 is invalid"; break;
   }

   .. check half a dozen more things ..

   // Only executes if all checks succeed.
   do_some_updates();

} while (false)

Кроме того, я думаю, это не технически цикл. Больше похоже на способ избежать использования GOTO:)

Ответ 5

Я обычно использую do-while, когда что-то должно произойти, но это не обязательно произойдет "правильно" в первый раз. Например:

int x;
do
{
    x = random.next(100);
    cout << x << endl;
} while (x != 13);

В этом случае x, с которого вы начинаете, не имеет значения, потому что он перезаписан.

Ответ 6

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

Ответ 7

Когда более целесообразно что-то делать, а затем оценивать логическое выражение... или, как сказал Брайан, когда вам нужно что-то сделать хотя бы один раз. Этот синтаксис перемещает оценку булевского выражения после цикла, а не перед циклом.

Ответ 8

Всякий раз, когда то, что находится в цикле, должно выполняться хотя бы один раз.

Ответ 9

Я давно занимаюсь этим, пока не используется на языках C, насколько это должно быть, потому что повторное использование ключевого слова "while" является неудобным и запутанным. Повтор Pascal-до тех пор, пока не будет передан ни один из ключевых слов с его структурой в начале-начале.

Мне бы хотелось когда-нибудь проанализировать большую кучу кода и посмотреть, действительно ли пока недопредставлено в коде C по сравнению с аналогичными конструкциями на других языках.

Ответ 10

do while(), тогда как условие true, но, с другой стороны, Pascal repeat until выполняет цикл, когда условие false (оба будут выполняться как минимум один раз).

Когда я программирую в Паскале, я почти всегда использую repeat until.
Когда я программирую на С++, я почти всегда использую while() {}. Я не могу объяснить, почему, но я чувствую это нормально. Weird?

Ответ 11

при чтении из файла или ожидании установления соединения (другое взаимодействие с человеком), все, что число итераций неизвестно априори (например, количество записей, возвращаемых SQL-запросом), или когда вы делаете шаги разного размера (например, читайте 1 или 5 строк из файла в зависимости от последнего прочитанного) при переходе по всем комбинациям/перестановкам объектов, когда условия цикла "for" становятся громоздкими

Ответ 12

Другое исключение, когда вы делаете что-то рекурсивное, например следующее: чтение внутренних исключений:

catch(Exception exc)
{
    Exception currentException = exc;
    do
    {
        Console.WriteLine(string.Format("{0}: {1}", currentException.GetType().Name, currentException.Message));
    } while((currentException = currentException.InnerException) != null);
}