Главная arrow Программирование С++ arrow Выполнение цикла do-while

Выполнение цикла do-while

Обработка цикла do-while очень похожа на обработку цикла while. Когда
функция interp () находит оператор do, она вызывает функцию exec_do (),
код которой приведен далее.
// Выполняет цикл do.
void exec_do()
{
int cond; char *temp;
// Сохраняет местоположение начала цикла do. putbackO; // возвращает во входной поток лексему do temp - prog;
get_token(); // получает начало блока цикла
// Подтверждает начало блока. get_token(); if(*token != '{')
throw InterpExc(BRACE_EXPECTED); putback();
interp (); // интерпретирует цикл
// Ищет оператор break в цикле, i f(breakfound)  { prog — temp;
// Находит начало блока в цикле, do {
get_token(); } while(*token != '{' && tok != END);
// Находит конец блока while, putback(); find_eob();
// Теперь находит конец выражения while, do {
get_token(); } while(*token != ';' && tok != END); if(tok == END) throw InterpExc(SYNTAX);
breakfound = false; return;
}
get_token();
if(tok != WHILE)  throw InterpExc(WHILE_EXPECTED); eval_exp(cond); // проверяет условие цикла
// Если true, повторяет цикл; в противном случае идет дальше, if(cond) prog = temp;
}
Главное отличие цикла do/while от цикла while состоит в том, что цикл do/while всегда выполняется хотя бы один раз, поскольку его условное выражение расположено в конце цикла. Следовательно, функция exec_do сначала сохраняет в переменной temp местоположение начала цикла и затем вызывает функцию interpo для интерпретации блока кода, входящего в цикл. Когда функция interpo завершает работу, получается соответствующая while-часть блока и вычисляется условное выражение. Если оно равно true, в указатель prog помещается адрес начала цикла. Если обнаружен оператор break, итерация цикла прекращается и находится конец блока цикла.