Учебники

Эйфория – Контроль потока

Поток выполнения программы относится к порядку выполнения операторов программы. По умолчанию операторы выполняются один за другим.

Тем не мение; Много раз порядок выполнения должен быть изменен от порядка по умолчанию, чтобы выполнить задачу.

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)

Это дает следующий результат –