Тут где-то долго спорили о легитимности выхода из середины цикла.
Добавлю свои 5 копеек.
Я для книжки по системному программированию склепал несколько абстрактных машин.
В одной из них по аналогии с БЭСМ-6 система команд является одноадресной.
И по 2 команды в машинном слове размещается.
Основной цикл процессора (С++):
Код:
while (true)
{ RM = mem[RA]; // выбрать слово
RA = (RA + 1) % N; // изменение адреса - по модулю 1024
RC = RM.cmd.first; // выбрать команду first
run(); // выполнить команду
if (Error || stop) break; // если команда stop или ошибка
RC = RM.cmd.second; // выбрать команду second
run(); // выполнить команду
if (Error || stop) break; // если команда stop или ошибка
}
Небольшие пояснения.
Процессор выбирает слово с 2 командами в регистр RM
из регистра RM команда попадает в регистр команд.
В функции run анализируется код операции и команда исполняется.
Если это команда Stop или при выполнении были ошибки (Error = true), то процессор останавливается
С чисто программистской точки зрения - очень простой цикл, который можно написать, не очень заморачиваясь об инвариантах. Выход из середины смотрится нормально и естественно.
Если же писать условие окончания-продолжения в условии цикла, то вторая команда выполняется всегда.
А вот такой вариант:
Код:
while (!Error & !stop)
{ RM = mem[RA]; // выбрать слово
RA = (RA + 1) % N; // изменение адреса - по модулю 1024
RC = RM.cmd.first; // выбрать команду first
run(); // выполнить команду
if (Error || stop) break; // если команда stop или ошибка
RC = RM.cmd.second; // выбрать команду second
run(); // выполнить команду
}
мне нравится ГОРАЗДО меньше, поскольку условия выхода разные и еще в разных местах находятся.
Жаль, конечно, что в С++ нет цикла loop - он здесь бы очень подошел.
Выскажетесь, пожалуйста, по поводу приемлемости-неприемлемости такого рода циклов в обучении.
Еще хотелось бы об инварианте такого цикла что-нить увидеть.
Если кто предложит более подходящий вариант - возьму на вооружение.