Ошибки в передачах управления

1. Если в программе содержится переключатель (например, вычисляемый оператор GO TO в Фортране или его аналог ON… GOTO в Бейсике), то может ли значение индекса когда-ли­бо превысить число возможных переходов? Например, всегда ли L будет принимать значение 1, 2 или 3 в операторе Фортрана GO TO (200, 300, 400), L или операторе Бейсика ON L GOTO 200, 300, 400?

2. Будет ли каждый цикл, в конце концов, завершен? Придумайте неформальное доказательство или аргументы, подтверждающие их завершение.

3. Будут ли программа, модуль или подпрограмма, в конечном счете, завершены?

4. Возможно ли, что из-за входных условий цикл никогда не сможет выполняться? Если это так, то является ли это оплошностью? Например, что произойдет для циклов, начинающихся операторами:

DO WHILE (NOTFOUND)

DO I=X ТО Z

если первоначальное значение NOTFOUND — ложь или если Х больше Z?

5. Для циклов, управляемых как числом итераций, так и булевским условием (например, цикл для организации поиска), какова последовательность «погружения в тело цикла»? Например, что произойдет с циклом, имеющим заголовок

DO I=1 ТО TABLESIZE WHILE (NOTFOUND)

если NOTFOUND никогда не принимает значение «ложь»?

6. Существуют ли какие-ни­будь ошибки «отклонения от нормы» (например, слишком большое или слишком малое число итераций)?

7. Если язык программирования содержит понятие группы операторов (например, DO-груп­пы в PL/1, ограниченные операторами DO-END), то имеется ли явный оператор END для каждой группы и соответствуют ли операторы END своим группам?

8. Существуют ли решения, подразумеваемые по умолчанию? Например, пусть ожидается, что входной параметр X принимает значения 1, 2 или 3. Логично ли тогда предположить, что он должен быть равен 3, если он не равен 1 или 2? Например, рассмотрим программу на языке Си:

switch(X)

{

case 1: printf(“1!!!”); break;

case 2: printf(“2!!!”); break;

default: printf(“3!!!”);

}

Коль скоро это так, то является ли предположение правильным?