美思 [Nim] 語言程式教學:控制結構 (Control Structure)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

在預設情形下,程式執行順序是由上而下依序執行。透過控制結構 (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"

由於 n0,會執行 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

whenif 類似,用於選擇結構,實例如下:

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"

whenif 最大的不同在於 when 是在編譯期執行,通常用於條件編譯,類似 C 語言巨集的 #ifdef

關於作者

身為資訊領域碩士,美思認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

美思喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,美思將所學寫成文章,放在這個網站上和大家分享。