前言
在預設情形下,程式執行順序是由上而下依序執行。透過控制結構 (control structure),可以改變程式運行的順序,程式好像有自己的判斷力般。控制結構分為兩類:
- 選擇 (selection):選擇是否執行某個程式碼區塊
- 迭代 (iteration):重覆執行某個程式嗎區塊
本文會介紹 Nim 可用的控制結構。
if
由於 if 在英文中剛好是「如果」的意思,大部分程式語言都會用 if 做為選擇結構的關鍵字。Nim 語言也是使用 if
做為選擇結構的關鍵字。
if
寫成虛擬碼如下:
if cond:
stat
在這段虛擬碼中,只有 cond
的條件為真,才會執行 stat
的程式碼。
我們可以額外加一段 else
區塊,這時候 if
敘述會成為二元敘述:
if cond:
stat_a
else:
stat_b
在這段虛擬碼中,當 cond
為真時,執行 stat_a
;反之,執行 stat_b
。
我們還可以加上一至多個 elif
區塊,這時候 if
敘述會成為多元敘述:
if cond_a:
stat_a
elif cond_b:
stat_b
else:
stat_c
我們用上述概念寫一個短例如下:
const n = 0
if n > 0:
echo "n is larger than zero"
elif n < 0:
echo "n is smaller than zero"
else:
echo "n is equal to zero"
由於 n
為 0
,會執行 else
區塊內的程式碼。
case
case
承襲 C 家族的 switch 結構,算是一種簡化 if
的語法糖。實例如下:
import times
let week = getLocalTime(getTime()).weekday
case week
of Weekday.dWed:
echo "Hump day"
of Weekday.dFri:
echo "Thank God It's Friday"
of Weekday.dSat, Weekday.dSun:
echo "Weekend"
else:
echo "Week"
case
也可用於一段區間 (range),實例如下:
let score = 88
case score
of 90..100:
echo "A"
of 80..89:
echo "B"
of 70..79:
echo "C"
of 60..69:
echo "D"
else:
echo "F"
基本上,case
敘述都可以改寫成等義的 if
敘述,只是程式碼會變長。讀者可以自行練習看看。
while
while
是用於迭代次數未知的迭代結構,只要符合條件,就會一直迭代下去。實例如下:
var i = 1
while i <= 10:
echo i
i += 1
for
對於迭代次數已知的程式,使用 for
可以簡化程式碼。實例如下:
for i in countup(1, 10):
echo i
也可以使用區間 (range),如下例:
for i in 1 .. 10:
echo i
如果計數器 (counter) 每次跳動不為 1,可手動指定參數,如下例:
for i in countup(1, 10, 2):
echo i
另外還有使用陣列、序列、其他容器或迭代器 (iterator) 來迭代的 for
結構,將於後文介結。
break
break
用於提早離開迭代結構,實例如下:
var i = 1
while true:
if i > 5:
break
echo i
i += 1
continue
continue
用於跳過本次迭代結構剩下的程式碼,繼續下一次迭代。實例如下:
for i in countup(1, 10):
if i mod 2 != 0:
continue
echo i
when
when
和 if
類似,用於選擇結構,實例如下:
when system.hostOS == "windows":
echo "running on Windows!"
elif system.hostOS == "linux":
echo "running on Linux!"
elif system.hostOS == "macosx":
echo "running on Mac OS X!"
else:
echo "unknown operating system"
when
和 if
最大的不同在於 when
是在編譯期執行,通常用於條件編譯,類似 C 語言巨集的 #ifdef
。