break 敘述(The break Statement)
break
敘述可以跳出包含此 break
敘述且最內層的迴圈,此敘述只能用於迴圈的主體(body)之中,下面的例子會找出指定整數的最小因數,並且標明質數:
num = 103; div = 2; while (div*div <= num) if (rem (num, div) == 0) break; endif div++; endwhile if (rem (num, div) == 0) printf ("Smallest divisor of %d is %d\n", num, div) else printf ("%d is prime\n", num); endif
在 while
迴圈中的第一行,若判斷 num
除以 div
的餘數等於 0
,則直接跳出 while
迴圈,並繼續執行 while
迴圈之後的程式碼,這與 exit
敘述直接跳出整個程式是不一樣的。
下面的程式碼其功能與上面的相同,但這裡將 while
的判斷式以其中的 if
配合 break
敘述來取代:
num = 103; div = 2; while (1) if (rem (num, div) == 0) printf ("Smallest divisor of %d is %d\n", num, div); break; endif div++; if (div*div > num) printf ("%d is prime\n", num); break; endif endwhile
continue 敘述(The continue Statement)
continue
敘述跟 break
敘述一樣只能用於迴圈的主體之中,但 break
是直接跳出迴圈,而 continue
敘述會跳過目前的迭代,並從下一次的迭代開始執行,並不是跳出整個迴圈,例如:
num = 1:10; for x = num if(rem(x, 3) != 0) continue; endif printf("%d\n", x); endfor
這個例子會將 1
到 10
之中所有被 3
整除的數字列出來,在 for
迴圈中的第一行,若是判斷 x
除以 3
的餘數不是 0
,則使用 continue
跳過以下的程式碼(即 printf
),進行下一個數字的檢查,其輸出為
3 6 9
這個範例只是要示範如何使用 continue
敘述,在實際的程式中,上面的程式碼可以改寫為更簡潔的形式:
num = 1:10; for x = num if(rem(x, 3) == 0) printf("%d\n", x); endif endfor
unwind_protect 敘述(The unwind_protect Statement)
Octave 中提供了一個用於例外處理(exception handling)的 unwind_protect
敘述,其作用類似 Lisp 語言的 unwind-protect
,用法為:
unwind_protect body unwind_protect_cleanup cleanup end_unwind_protect
body
與 cleanup
可以是任何的 Octave 敘述,並且都是選擇性的(可以省略),不管 body
的執行結果如何(即使有錯誤發生),最後 cleanup
的程式碼一定會被執行。
unwind_protect
敘述可以避免由於執行錯誤而導致更動到一些全域變數的情況,下面的範例中不管 body
執行的情況如何,全域變數 frobnosticate
都會保持原來的值:
save_frobnosticate = frobnosticate; unwind_protect frobnosticate = true; % ... unwind_protect_cleanup frobnosticate = save_frobnosticate; end_unwind_protect
若沒有使用 unwind_protect
敘述,則當前面的程式碼(body
部份)執行出現錯誤時,會直接離開此程式,位於後面的程式碼(cleanup
部份)將不會被執行。
try 敘述(The try Statement)
除了 unwind_protect
敘述之外,Octave 也支援另一種例外處理的 try
敘述,其用法為:
try body catch cleanup end_try_catch
其中 body
與 cleanup
可以是任何的 Octave 敘述,並且都是選擇性的(可以省略),cleanup
的程式碼只有在 body
執行出現錯誤時才會執行。
在 try
敘述中的 body
程式碼出現錯誤時,並不會輸出錯誤訊息,在 cleanup
中可以使用 lasterr()
函數來取得最後一次的錯誤訊息(關於 lasterr()
函數可以參考錯誤與警告),例如:
try error("test message.") catch errmsg = lasterr(); printf("Error Message: %s\n", errmsg); end_try_catch
輸出為
Error Message: test message.
try
與 catch
敘述的功能與 eval(try, catch)
相同,但其在執行的效率較高,因為 Octave 不需要在每一次執行前解析程式碼。
多行指令(Continuation Lines)
在 Octave 中的敘述都是以換行符號作為一個指令的結束,若要將一個指令分成多行來輸入,則可以在行尾加上多行連續符號 ...
或 \
以接下一行,例如:
x = 1 + 2 + 3 ... + 4 + 5 \ + 6 + 7
這樣會輸入一個跨越三行的敘述,反斜線若位於一行的最後一個字元會被當成連接行與行的符號,而不會被視為除法運算子。
只要不是使用在字串內,多行連續符號之後還可以再加上空白或註解,例如上面的敘述也可以這樣寫:
x = 1 + 2 + 3 ... # comment one + 4 + 5 # comment two + 6 + 7 # last comment
若是在字串當中使用多行連續符號,則必須放在一行的結尾,其後方緊接著換行字元。
若是將括號中的敘述分成多行,則可以不需要加入多行連續符號,例如:
if (fine_dining_destination == on_a_boat || fine_dining_destination == on_a_train) seuss (i, will, not, eat, them, sam, i, am, i, will, not, eat, green, eggs, and, ham); endif
這樣可以不需要輸入讓人感覺難以閱讀的多行連續符號。