Возможно ли иметь цикл while в c ++, который делает проверку в середине цикла вместо начала или конца? - PullRequest
4 голосов
/ 27 ноября 2009

Я хочу, чтобы цикл while делал что-то вроде следующего, но возможно ли это в c ++? Если да, как работает синтаксис?

<code>
do {
    //some code
    while( expression to be evaluated );
    // some more code
}

Я бы хотел, чтобы цикл был завершен, как только оператор while решит, что выражение больше не истинно (т. Е. Если выражение ложно, // какой-то еще код не выполняется)

Ответы [ 5 ]

12 голосов
/ 27 ноября 2009

Вы можете сделать:

while (1) {
   //some code
   if ( condition) {
       break;
   }
   // some more code
}
6 голосов
/ 27 ноября 2009

Немного предыстории и анализа: то, что вы просите, я слышал, называется " петля Даля ", названная в честь Оле-Йохана Даля из Симулы. Как утверждает Шон Э., в C ++ их нет (кроме ответа ima), хотя некоторые другие языки есть (в частности, Ada). Он может заменять циклы «do-while» и «while-do», что делает его полезной конструкцией. В более общем случае допускается произвольное количество тестов. Хотя C ++ не имеет специального синтаксиса для циклов Даля, ответы Шона МакКолиффа и Арака полностью эквивалентны им. Цикл "while (true)" должен быть превращен компилятором в простой переход, поэтому скомпилированная версия полностью неотличима от скомпилированной версии гипотетического цикла Дала. Если вы найдете его более читабельным, вы также можете использовать

do {
    ...
} while (true);
3 голосов
/ 27 ноября 2009

Технически, да:

 for ( ;CodeBefore, Condition; ) {CodeAfter}
3 голосов
/ 27 ноября 2009

Ну, я думаю, вы должны переместить условие в середину цикла (?):

while (true)
{
  ...
  // Insert at favorite position
  if (condition)
    break;
  ...
}
1 голос
/ 27 ноября 2009

Ответ - нет, вы не можете автоматически завершить ваш цикл, когда условие, которое должен выполнять оператор while, является истинным, пока он фактически не оценит его в верхней (или нижней) части цикла. Оператор while нельзя поместить в середину цикла.

...