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。这将重试执行最外层循环,无论深度如何。同样,retry -1 重试第二外层循环,依此类推。

通常,包含 retry 语句的子块还包含另一个流程控制关键字,如 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

由于 retry 不会更改 i 的值并尝试再次打开相同的文件,因此必须有一种方法可以从循环中退出,exit 语句提供了这种方法。

goto 语句

goto 语句指示计算机在带标签的位置恢复代码执行。

恢复执行的位置称为语句的目标。它仅限于位于当前例程中,或者如果位于任何例程之外,则位于当前文件中。

语法

goto 语句的语法如下:

goto "Label Name"

goto 语句的目标可以是任何可访问的label 语句:

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)

这将产生以下结果:

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
广告