位置:首页 > 高级语言 > Euphoria在线教程 > Euphoria流程控制

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 语句:

exit语句 break语句 的工作原理完全一样,但由 if语句或switch语句提供,而不是适用于任何形式的循环语句。

语法:

 break 语句的语法是:

break [ "Label Name" ] [Number]

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

 break N 的一种特殊形式是break 0。这使得如果开关块的最外层,不管深度。继续控制后的最外块。同样,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 Nr的一种特殊形式是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

这将产生以下结果:

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 [ "Label Name" ] [Number]

重试执行当前迭代的循环,它适用于语句重试。声明跳转到指定的循环的第一条语句,没有测试任何东西,也递增循环索引。

retry n 的一种特殊形式是 retry 0。此最外层循环执行的重试次数,而不管深度。同样地,重试retry -1 的第二最外层循环等等。

通常情况下,一个子块,其中包含了重试语句还包含另一个流控制包含退出,继续进行或中断,因为否则会无休止地执行迭代。

例子:

#!/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 的值,并试图再次打开相同的文件,必须有一种方式来脱离循环可由 exit 语句提供。

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)

这将产生以下结果:

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