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
,則只有對應到第一個符合的 label
的 command_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 中每個 case
的 command_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
可以是任何的敘述,當 condition
為 true
時,就會執行 body
一次,執行完 body
再重新檢查 condition
,若為 true
則繼續執行 body
,不斷重複直到 condition
為 false
為止。若第一次檢查 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
之間可以不需要換行,不過除了很簡單的迴圈之外,使用換行可以使程式碼更容易閱讀。