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