Поток выполнения программы относится к порядку выполнения операторов программы. По умолчанию операторы выполняются один за другим.
Тем не мение; Много раз порядок выполнения должен быть изменен от порядка по умолчанию, чтобы выполнить задачу.
Euphoria имеет ряд операторов управления потоком, которые вы можете использовать для упорядочения порядка выполнения операторов.
Заявление о выходе
Выход из цикла выполняется с помощью ключевого слова exit . Это приводит к тому, что поток немедленно покидает текущий цикл и возобновляет работу с первым оператором после окончания цикла.
Синтаксис
Синтаксис оператора выхода следующий:
exit [ "Label Name" ] [Number]
Оператор выхода завершает последний и самый внутренний цикл, пока не будет указано необязательное имя или номер метки.
Особой формой выхода N является выход 0 . Это оставляет все уровни петли, независимо от глубины. Управление продолжается после самого внешнего блока цикла. Аналогично, выход -1 выходит из второго внешнего цикла и т. Д.
пример
#!/home/euphoria-4.0b2/bin/eui integer b for a = 1 to 16 do printf(1, "value of a %d\n", a) if a = 10 then b = a exit end if end for printf(1, "value of b %d\n", b)
Это дает следующий результат —
value of a 1 value of a 2 value of a 3 value of a 4 value of a 5 value of a 6 value of a 7 value of a 8 value of a 9 value of a 10 value of b 10
Оператор перерыва
Оператор break работает точно так же, как оператор exit , но применяется к операторам if или switch, а не к циклам операторов любого вида.
Синтаксис
Синтаксис оператора break следующий:
break [ "Label Name" ] [Number]
Оператор break завершает последний и самый внутренний блок if или switch до тех пор, пока не будет указано необязательное имя или номер метки.
Особой формой разрыва N является разрыв 0 . Это оставляет самый внешний блок if или switch независимо от глубины. Контроль продолжается после самого внешнего блока. Аналогично, break -1 разрывает второй крайний блок if или switch и так далее.
пример
#!/home/euphoria-4.0b2/bin/eui integer a, b sequence s = {'E','u', 'p'} if s[1] = 'E' then a = 3 if s[2] = 'u' then b = 1 if s[3] = 'p' then break 0 -- leave topmost if block end if a = 2 else b = 4 end if else a = 0 b = 0 end if printf(1, "value of a %d\n", a) printf(1, "value of b %d\n", b)
Это дает следующий результат —
value of a 3 value of b 1
Продолжение заявления
Оператор continue продолжает выполнение цикла, к которому он применяется, переходя к следующей итерации и пропуская оставшуюся часть итерации.
Переход к следующей итерации означает тестирование индекса условной переменной и проверку того, находится ли он в пределах границ.
Синтаксис
Синтаксис оператора continue следующий:
continue [ "Label Name" ] [Number]
Оператор continue будет повторять самый последний и самый внутренний цикл до тех пор, пока не будет указано необязательное имя или номер метки.
Особой формой продолжения N является продолжение 0 . Это повторяет самый внешний цикл, независимо от глубины. Аналогично, продолжить -1 начинается со второго внешнего цикла и так далее.
пример
#!/home/euphoria-4.0b2/bin/eui for a = 3 to 6 do printf(1, "value of a %d\n", a) if a = 4 then puts(1,"(2)\n") continue end if printf(1, "value of a %d\n", a*a) end for This would produce following result: value of a 3 value of a 9 value of a 4 (2) value of a 5 value of a 25 value of a 6 value of a 36
Повторное заявление
Оператор retry продолжает выполнение цикла, к которому он применяется, переходя к следующей итерации и пропуская оставшуюся часть итерации.
Синтаксис
Синтаксис оператора повтора следующий:
retry [ "Label Name" ] [Number]
Оператор retry повторяет выполнение текущей итерации цикла, к которому он применяется. Оператор переходит к первому оператору обозначенного цикла, не проверяя ничего и не увеличивая индекс цикла for.
Особой формой повторной попытки является повтор 0 . Это повторяет выполнение самого внешнего цикла, независимо от глубины. Аналогично, повторная попытка -1 повторяет второй самый внешний цикл и так далее.
Как правило, подблок, который содержит оператор повтора, также содержит другое ключевое слово управления потоком, например, exit, continue или break. В противном случае итерация будет выполняться бесконечно.
пример
#!/home/euphoria-4.0b2/bin/eui integer errors = 0 integer files_to_open = 10 for i = 1 to length(files_to_open) do fh = open(files_to_open[i], "rb") if fh = -1 then if errors > 5 then exit else errors += 1 retry end if end if file_handles[i] = fh end for
Поскольку повтор не изменяет значение i и пытается снова открыть тот же файл, должен быть способ выйти из цикла, который обеспечивает оператор выхода.
Goto заявление
Оператор goto указывает компьютеру возобновить выполнение кода в отмеченном месте.
Место для возобновления выполнения называется целью оператора. Запрещено находиться в текущей подпрограмме или в текущем файле, если она находится вне подпрограммы.
Синтаксис
Синтаксис оператора goto следующий:
goto "Label Name"
Целью оператора goto может быть любой доступный оператор метки —
label "Label Name"
Имена меток должны быть константой в двойных кавычках. Символы, которые недопустимы в идентификаторах Euphoria, могут появляться в имени метки, так как это обычная строка.
пример
#!/home/euphoria-4.0b2/bin/eui integer a = 0 label "FIRST" printf(1, "value of a %d\n", a) a += 10 if a < 50 then goto "FIRST" end if printf(1, "Final value of a %d\n", a)
Это дает следующий результат —