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

這個例子會將 110 之中所有被 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

bodycleanup 可以是任何的 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

其中 bodycleanup 可以是任何的 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.

trycatch 敘述的功能與 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

這樣可以不需要輸入讓人感覺難以閱讀的多行連續符號。