switch 敘述(The switch Statement)

在撰寫程式時常常會需要依照某一個變數的值來決定執行哪一段程式碼,這種情況可以使用 if 敘述,例如:

if (X == 1)
  do_something ();
elseif (X == 2)
  do_something_else ();
else
  do_something_completely_different ();
endif

不過這樣的寫法非常累贅,Octave 亦支援專門用於此情況的 switch 敘述,上面的程式碼可以使用此敘述改寫為:

switch (X)
  case 1
    do_something ();
  case 2
    do_something_else ();
  otherwise
    do_something_completely_different ();
endswitch

使用 switch 敘述可以讓程式碼看起來更簡潔也更容易閱讀,在維護上也更方便,例如若要將變數 X 換成另一個變數名稱,只需要更改第一行,若是使用 if 敘述則需要更改每一個判斷式。

switch 敘述的標準使用方式為:

switch expression
  case label
    command_list
  case label
    command_list
  # ...

  otherwise
    command_list
endswitch

其中 label 可以是任何算式,若是有重複的 label,則只有對應到第一個符合的 labelcommand_list 會被執行,剩餘的會被忽略。在 switch 敘述中至少要有一個 case 敘述(否則這個 switch 敘述就沒有意義了),而最後的 otherwise 敘述則是可有可無。

label 為一個巢狀陣列(cell array),則當此巢狀陣列中的任何一個元素符合 expression 時,就會執行其對應的 command_list,例如:

A = 7;
switch A
  case { 6, 7 }
    printf ("variable is either 6 or 7\n");
  otherwise
    printf ("variable is neither 6 nor 7\n");
endswitch

其輸出為

variable is either 6 or 7

endswitch 敘述與其他敘述一樣可以用 end 取代,但建議還是使用 endswitch 以避免錯誤發生。

使用 switch 敘述而不使用 if 敘述的另外一個好處是 label 可以為字串,if 無法直接判斷字串是否相等,例如:

x = "test";
if(x == "another")
  y = 1
endif

因為 x == "another" 會執行字元對字元的比對,所以這樣會產生錯誤:

error: mx_el_eq: nonconformant arguments (op1 is 1x4, op2 is 1x7)

switch 可以判斷字串是否相等:

x = "test";
switch (x)
case "another"
  y = 1
case "test"
  y = 2
endswitch

輸出為

y =  2

在 C 語言中也有 switch 敘述,但其用法與 Octave 的 switch 有些差異:第一個差異是 Octave 中的每個 case 預設就是獨立的,執行完一個 case 就會跳開,不需要像 C 語言使用 break。另一個差異是 Octave 中每個 casecommand_list 是不可省略的,例如 C 語言可以這樣寫:

switch (foo) {
  case 1:
  case 2:
    doit ();
}

但在 Octave 中必須改寫成這樣:

switch (foo)
  case {1, 2}
    doit();
endswitch

while 敘述(The while Statement)

程式中的迴圈(loop)可以在符合指定條件的情況下,重複執行某一段程式碼。Octave 中最簡單的迴圈結構就是 while 敘述,它會在指定的條件為 true 時重複執行其中的程式碼,其判斷方式與 if 敘述相同,當值為 0 時則視為 false,否則視為 true,若為向量或矩陣,則只有當向量或矩陣不是空矩陣且所有的元素值都不是 0 時,才視為 true,否則視為 false

Octave 中 while 敘述的使用方式為:

while (condition)
  body
endwhile

其中 body 可以是任何的敘述,當 conditiontrue 時,就會執行 body 一次,執行完 body 再重新檢查 condition,若為 true 則繼續執行 body,不斷重複直到 conditionfalse 為止。若第一次檢查 condition 就是 false,則 body 就不會被執行。

下面的範例會產生一個含有 Fibonacci 數列的變數 fib

fib = ones (1, 10);
i = 3;
while (i <= 10)
  fib (i) = fib (i-1) + fib (i-2);
  i++;
endwhile

這裡的 body 含有兩個敘述。這個迴圈一開始的 i 是設為 3,然後 while 會檢查 i 是否小於或等於 10,若 i 小於或等於 10 則會將 fib 的第 i 個元素設為其第 i-1 與第 i-2 個元素的和,然後再將 i 的值加 1,重複這個動作直到 i 增加到 11 為止。

while 敘述與 body 之間可以不需要換行,不過除了很簡單的迴圈之外,使用換行可以使程式碼更容易閱讀。