流量控制( Flow Control)
程序执行流程是指程序语句执行的顺序。 默认情况下,语句会一个接一个地执行。
然而; 很多时候,执行顺序需要从默认顺序改变,以完成任务。
Euphoria有许多flow控制语句,您可以使用它们来安排语句的执行顺序。
exit声明
使用关键字exit退出循环。 这会导致流程立即离开当前循环,并在循环结束后重新开始第一个语句。
语法 (Syntax)
exit语句的语法如下 -
exit [ "Label Name" ] [Number]
exit语句终止最新和最内层循环,直到指定可选标签名称或编号。
exit N特殊形式是exit 0 。 无论深度如何,都会留下所有级别的循环。 在最外面的循环块之后继续控制。 同样,退出-1退出第二个最外层循环,依此类推。
例子 (Example)
#!/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语句,而不是任何类型的循环语句。
语法 (Syntax)
break语句的语法如下 -
break [ "Label Name" ] [Number]
break语句终止最新和最内层的if或switch块,直到指定了可选的标签名称或编号。
break N一种特殊形式是break 0 。 无论深度如何,这都会留下最外面的if或switch块。 在最外面的块之后继续控制。 同样,break -1会破坏第二个最外面的if或switch块,依此类推。
例子 (Example)
#!/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语句继续执行它应用的循环,方法是进入下一次迭代并跳过迭代的其余部分。
进入下一次迭代意味着测试条件变量索引并检查它是否仍然在边界内。
语法 (Syntax)
continue语句的语法如下 -
continue [ "Label Name" ] [Number]
continue语句将重新迭代最新和最内部的循环,直到指定了可选的标签名称或编号。
continue N一种特殊形式是continue 0 。 无论深度如何,这都会重新迭代最外层的循环。 同样,继续-1从第二个最外层循环开始,依此类推。
例子 (Example)
#!/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语句继续执行它应用的循环,方法是进入下一次迭代并跳过迭代的其余部分。
语法 (Syntax)
重试语句的语法如下 -
retry [ "Label Name" ] [Number]
retry语句重试执行它适用的循环的当前迭代。 该语句分支到指定循环的第一个语句既不测试任何东西也不递增for循环索引。
retry N特殊形式是retry 0 。 无论深度如何,此重试都会执行最外层循环。 同样,重试-1重试第二个最外层循环,依此类推。
通常,包含重试语句的子块还包含另一个流控制关键字,如exit,continue或break。 否则,迭代将无休止地执行。
例子 (Example)
#!/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语句指示计算机在标记的位置恢复代码执行。
恢复执行的地方称为语句的目标。 它被限制在当前例程中,或者如果在任何例程之外,则被限制在当前文件中。
语法 (Syntax)
goto语句的语法如下 -
goto "Label Name"
goto语句的目标可以是任何可访问的label语句 -
label "Label Name"
标签名称必须是双引号常量字符串。 在Euphoria标识符中非法的字符可能出现在标签名称中,因为它是常规字符串。
例子 (Example)
#!/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