Octave 中的敘述(statements)可以是簡單的常數或是複雜的運算式與判斷式。控制敘述(control statements)可以控制 Octave 程式的執行,例如:ifwhile 等敘述。許多控制敘述中還會包含了其他的敘述,例如 if 敘述就常常包含了一些可執行或是不可執行的敘述。

每一個控制敘述都會包含一個對應的結束敘述,例如 endif 就是表示 if 敘述的結束,endwhile 則表示 while 敘述的結束,所有的結束敘述都可以簡寫成 end,但建議還是以完整的結束敘述為主,因為使用完整的結束敘述可以提供 Octave 更多資訊以偵測程式上可能發生的錯誤(例如漏寫了結束敘述等)。


介於控制敘述(例如 if)與其對應的結束敘述(例如 endif)之間的敘述,稱為此控制敘述的主體(body)。

if 敘述(The if Statement)

if 敘述會根據使用者指定的條件判斷式而決定是否要執行某一段程式,此敘述有三種用法,最簡單的就像這樣:

if (condition)
  # then-body
endif

if 敘述會根據 condition 的結果來決定是否要接下去執行,若 condition 的結果為 true,則會執行 then-body 部分的程式碼。而 condition 的計算結果若為 0,則會被視為 false,若不是 0 則視為 true;若 condition 的結果是一個向量,則只有在向量中所有的元素都是 0 的情況下才會被視為 false,其他的情形都會被視為 true

if 敘述的第二種使用方式是多加入一個 else 敘述:

if (condition)
  # then-body
else
  # else-body
endif

condition 的結果為 true 則執行 then-body,否則執行 else-body。例如:

if (rem (x, 2) == 0)
  printf ("x is even\n");
else
  printf ("x is odd\n");
endif

在這個列子中,若是 rem (x, 2) == 0 的結果為 true(即 x2 整除),則第一個 printf 會被執行,否則執行第二個 printf

if 敘述的第三種使用方式(也是最常見的方式)是再加入一個 elseif 敘述,這樣可以允許加入多個不同的判斷式:

if (condition)
  # then-body
elseif (condition)
  # elseif-body
else
  # else-body
endif

elseif 敘述的個數沒有限制,這些判斷式會依照順序執行,當其中一個 condition 的結果為 true 時,則會執行其對應的程式碼,之後剩餘的 elseif 則會直接跳過,不會繼續檢查;若每一個判斷式皆為 false,則會執行 else-bodyelse 敘述必須放在最後一個位置,並且一組 if 敘述中最多只能有一個 else 敘述。

下面的範例中,當 rem (x, 2) == 0 的結果為 true 時(即 x2 整除),則會執行第一個 printf,若其結果為 false,則會繼續判斷第二的 elseif 中的 rem (x, 3) == 0,若其結果為 true(即 x3 整除),則會執行第二個 printf;若兩個判斷式的結果都是 false,則會執行最後一個 printf

if (rem (x, 2) == 0)
  printf ("x is even\n");
elseif (rem (x, 3) == 0)
  printf ("x is odd and divisible by 3\n");
else
  printf ("x is odd\n");
endif

elseif 不能像 Fortran 語言一樣拆成 else if,如果拆成這樣的寫法,Octave 視為在一個 else 敘述中包含另外一個 if 敘述,例如:

if (c1)
  # body-1
else if (c2)
  # body-2
endif

若是這樣寫 Octave 會將最後一行的 endif 視為第二個 if 敘述的結束,若是使用互動是的命列列輸入,則 Octave 會繼續等待使用者輸入程式碼,直到輸入了第一個 if 敘述的 endif 為止;若從檔案中載入程式碼,則 Octave 可能會出現警告訊息或是直接產生錯誤的結。將此程式碼重新排版後,更可以看出問題所在:

if (c1)
  # body-1
else
  if (c2)
    # body-2
  endif

這樣就可以很明顯的看出最後少了一個 endif 敘述。