Когда уместно заняться делом? - PullRequest
12 голосов
/ 24 июня 2009

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

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

Ответы [ 12 ]

54 голосов
/ 24 июня 2009

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

3 голосов
/ 24 июня 2009

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

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

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

do_all(a);
  • смысл в том, что он выполняется ровно один раз, а точка с запятой в конце вызова макроса завершает while (0); заявление.
3 голосов
/ 24 июня 2009

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

do {
    //do something
} while ( condition );
2 голосов
/ 24 июня 2009

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

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

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

2 голосов
/ 24 июня 2009

Я использовал его раньше, если мне нужно реализовать много условных проверок, например, обработку формы ввода в 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:)

1 голос
/ 24 июня 2009

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

0 голосов
/ 01 сентября 2011

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

catch(Exception exc)
{
    Exception currentException = exc;
    do
    {
        Console.WriteLine(string.Format("{0}: {1}", currentException.GetType().Name, currentException.Message));
    } while((currentException = currentException.InnerException) != null);
}
0 голосов
/ 24 июня 2009

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

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

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

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

Я не могу объяснить почему, но я чувствую, что это нормально . Weird

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

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

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

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