📜  Euphoria-流量控制

📅  最后修改于: 2020-11-04 07:45:40             🧑  作者: Mango


 

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

然而;许多次需要将执行顺序从默认顺序更改为完成任务。

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

退出声明

使用关键字exit退出循环。这将导致流程立即离开当前循环,并在循环结束后从第一条语句重新开始。

句法

exit语句的语法如下-

exit [ "Label Name" ] [Number]

exit语句终止最新的和最里面的循环,直到指定了可选的标签名称或编号。

出口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声明

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语句的语法如下-

continue [ "Label Name" ] [Number]

继续语句将重复最新和最里面的循环,直到指定了可选的标签名称或编号。

继续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语句的语法如下-

retry [ "Label Name" ] [Number]

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

重试N的一种特殊形式是重试0 。无论深度如何,此方法都会重试执行最外面的循环。同样,重试-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

由于重试不会更改i的值并尝试再次打开同一文件,因此必须有一种退出退出语句提供的循环的方法。

goto声明

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

恢复执行的地方称为语句的目标。它限制在当前例程中,或者在任何例程之外的当前文件中。

句法

goto语句的语法如下-

goto "Label Name"

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

label "Label Name"

标签名称必须为双引号常量字符串。在幸福感标识符中非法的字符可能会出现在标签名称中,因为它是一个常规字符串。

#!/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