Лекция: Прерывание итераций операторами EXIT и RETURN
Оператор EXIT, помещенный в теле циклов WHILE, REPEAT и FOR, приводит к немедленному окончанию цикла. Хороший стиль программирования призывает избегать такого приема, но иногда он весьма удобен. Рассмотрим, например, поиск элемента массива с определенным значением (х). Проще всего организовать линейный перебор при помощи цикла FOR:
bObtained:= FALSE;
FOR cN := 1 TO Maxlndex DO
IF x = aX[cN] THEN
Index:= cN;
bObtained := TRUE;
EXIT;
END_IF
END_FOR
IF bObtained THEN (*элемент найден, его индекс — Index*)
Для вложенного цикла оператор EXIT завершает только «свой» цикл, внешний цикл будет продолжать работу. Например:
FOR У := О ТО 9 DO
FOR x := О ТО 99 DO (* обрабатываем строку массива Агг[у][х]*)
>
IF… THEN EXIT; (*'хвост' строки обрабатывать не
надо, переходим к следующей*)
END_FOR
END_FOR
При необходимости завершения внешнего цикла по условию, возникшему во вложенном цикле, можно использовать пару синхронизированных операторов EXIT:
bBreakY := FALSE;
FOR у := О ТО 9 DO
FOR x := О ТО 99 DO
;
IF… THEN bBreakY := TRUE; EXIT; («прервать обработку*)
END_FOR
IF bBreakY THEN EXIT;
END_FOR
Оператор RETURN осуществляет немедленный возврат из POU. Это единственный способ прервать вложенные итерации без введения дополнительных проверок условий. Оператор RETURN выполняется очень быстро, фактически это одна машинная команда процессора. Но не стоит им злоупотреблять. Поскольку в тексте компонента, имеющего, например, 50 выходов, разобраться весьма не просто.
Иногда бывает удобно создать безусловный цикл, а условия выхода формировать в теле цикла с использованием EXIT. Например, могут потребоваться несколько равновероятных, но невзаимосвязанных условий выхода из цикла. Создать безусловный (бесконечный) цикл в ST проще всего так: WHILE TRUE DO...