Вопрос по – Когда уместно заняться делом?

11

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

Я понимаю, что нужно делать, но не когда его использовать.

@ Hardwareguy Совсем нет. Это пришло мне в голову, когда я работал над чем-то, что я не использовал во всем своем проекте. Alex S
Смежные вопросы:stackoverflow.com/questions/994905/… а такжеstackoverflow.com/questions/390605/while-vs-do-while Adam Rosenfield
Я уверен, что видел этот вопрос раньше. Не могу найти дурака, хотя. Nosredna
Да, я почти никогда не использую это. Даже в некоторых случаях, когда я знаю, что цикл должен быть выполнен один раз, прежде чем я проверю условие, первая итерация в некотором роде является особым случаем, так что имеет больше смысла размещать его вне блока цикла вообще. Sean
Домашнее задание? Hardwareguy

Ваш Ответ

12   ответов
0

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

3

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

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

do_all(a);
the point being that it gets executed exactly once and the semi-colon on the end of the macro call completes the while(0); statement.
2

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

Разве просто обернуть ту же логику в функцию и заменить разрывы возвращаемыми значениями было бы более читабельным? Вы также можете указать, какая проверка пошла не так в вашем возвращаемом значении.
@shylent - да, это так, поэтому я упомянул, что это, вероятно, не лучшая практика. Но это может пригодиться время от времени.
3

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

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

что do-while используется не столько в языках на основе C, сколько вshould быть потому, что повторное использование "while" Ключевое слово неудобно и запутанно. Pascal's repeat-till не разделяет никакие ключевые слова со своей структурой while-begin-end.

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

0

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

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

Я не могу объяснить, почему, но я чувствую этоnormal, Weird?

0

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

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

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

2

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

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

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

0

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

54

по крайней мере, один раз, но не знаете, сколько раз до начала цикла.

Но бывают случаи, когда вам не нужно делать do ... while для этого, например что-то вроде while (input.hasNext ()), так что это не обязательно жесткое правило.
"Инициирует цикл"? означают: 1. инициализацию переменной OUTSIDE оператор do ... while или 2. инициализацию переменной внутри тела оператора do ... while?
@ Томас Оуэнс: Ну, вы можете делать все виды циклов, которые вам нужны, с помощью простого оператора for, так что вам не нужно делать / while как таковые, но я бы сказал, что если вы хотите выразить намерение, то это ситуация, когда / пока подходит идеально.
Не мог бы сказать, что проще сам. +1
0

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

Похожие вопросы