Euphoria - 流程控制

程序执行流程是指程序语句的执行顺序。 默认情况下,语句会依次执行。

但是; 很多时候,需要更改默认顺序的执行顺序才能完成任务。

Euphoria 有许多流程控制语句,您可以使用它们来安排语句的执行顺序。

exit 语句

退出循环是通过关键字exit完成的。 这会导致流程立即离开当前循环并在循环结束后重新开始第一个语句。

语法

exit 语句的语法如下 −

exit [ "Label Name" ] [Number]

exit 语句终止最新且最内层的循环,直到指定可选标签名称或编号。

exit N 的特殊形式是exit 0。 这会留下所有级别的循环,无论深度如何。 控制在最外面的循环块之后继续。 同样,exit -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语句

break 语句的工作方式与 exit 语句完全相同,但适用于 if 语句或 switch 语句,而不适用于任何类型的循环语句。

语法

break 语句的语法如下 −

break [ "Label Name" ] [Number]

break 语句终止最新且最内层的 if 或 switch 块,直到指定可选标签名称或编号。

break N 的特殊形式是 break 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 语句的语法如下 −

continue [ "Label Name" ] [Number]

Continue 语句将重新迭代最新且最内层的循环,直到指定可选标签名称或编号。

Continue N 的特殊形式是Continue 0。 无论深度如何,这都会重复最外层的循环。 同样, continue -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 语句通过进入下一次迭代并跳过迭代的其余部分来继续执行它所应用的循环。

语法

retry 语句的语法如下 −

retry [ "Label Name" ] [Number]

retry 语句重试执行它所适用的循环的当前迭代。 该语句分支到指定循环的第一条语句,既不测试任何内容,也不增加 for 循环索引。

retry N 的特殊形式是retry 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 "Label Name"

label 标签名称必须是双引号常量字符串。 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)

这会产生以下结果 −

value of a 0
value of a 10
value of a 20
value of a 30
value of a 40
Final value of a 50