位元詩人 [Pascal] 程式設計教學:使用運算子 (Operator)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

在程式語言中,運算子是最基本的指令,無法再拆分成更簡約的形式。本文介紹 Pascal 的運算子。

算術運算子 (Arithmetic Operators)

算術運算子用在基礎代數運算,包含以下運算子:

  • +:相加
  • -:相減
  • *:相乘
  • /:相除 (回傳浮點數)
  • div:相除 (回傳整數)
  • mod:取餘數

注意一下相除運算子有兩種,會回傳不同型態的值。

以下是實際範例:

program main;

var
  a : integer;
  b : integer;

begin
  a := 3;
  b := 4;

  Assert(a + b = 7);
  Assert(a - b = -1);
  Assert(a * b = 12);
  Assert(a / b = 0);
  Assert(a mod b = 3);
end.

關係運算子 (Relational Operators)

關係運算子用來比較兩純量間的大小關係。以下是 Pascal 的關係運算子:

  • =:相等
  • <>:不相等
  • >:大於
  • >=:大於或等於
  • <:小於
  • <=:小於或等於

以下是實際範例:

program main;

var
  a : integer;
  b : integer;
  c : integer;

begin
  a := 3;
  b := 4;
  c := 3;

  Assert(a = c);
  Assert(a <> b);
  Assert(b > a);
  Assert(b >= a);
  Assert(a < b);
  Assert(a <= b);
end.

Pascal 刻意將 = (相等) 和 := (賦值) 的符號分開,在閱讀及撰寫程式碼時會比較容易區分。

邏輯運算子 (Logic Operators)

邏輯運算子用於邏輯運算或布林運算。Pascal 使用英文字做為邏輯運算子:

  • not:(邏輯的) 否
  • and:(邏輯的) 且
  • or:(邏輯的) 或

以下是實際範例:

program main;

begin
  (* NOT *)
  Assert((not true) = false);
  Assert((not false) = true);

  (* AND *)
  Assert((true and true) = true);
  Assert((true and false) = false);
  Assert((false and true) = false);
  Assert((false and false) = false);

  (* OR *)
  Assert((true or true) = true);
  Assert((true or false) = true);
  Assert((false or true) = true);
  Assert((false or false) = false);
end.

二元運算子 (Bitwise Operators)

二元運算子用於二元運算。Pascal 同樣以英文字做為二元運算子:

  • not:補數
  • and:(二元的) 且
  • or:(二元的) 或
  • xor:互斥或
  • shl:左移
  • shr:右移

二元運算會比一般的代數運算來得快,因為二元運算可直接由處理器的指令集來支援。一般來說,二元運算用於低階運算 (low-level computing),像是用於影像處理等領域。

以下是實際範例:

program main;

var
  a : integer;
  b : integer;

begin
  a := 3;  (* 0011 *)
  b := 5;  (* 0101 *)

  (*      0011
    and)  0101
    ----------
          0001  *)
  Assert((a and b) = 1);

  (*      0011
    or)   0101
    ----------
          0111  *)
  Assert((a or b) = 7);

  (*      0011
    xor)  0101
    ----------
          0110  *)
  Assert((a xor b) = 6);

  (* shl) 0000 0101
     --------------
          0000 1010  *)
  Assert((a shl 1) = 10);

  (* shr) 0000 0101
     --------------
          0000 0010  *)
  Assert((a shr 1) = 2);
end.

我們刻意在註解處寫出二元運算的過程,不熟二元運算的讀者可以參考一下。如果想要了解二元運算的細節,可以找計算機概論等書籍來看。

和字串 (String) 相關的運算子

Pascal 重覆使用 + 做為字串相接的運算子。像是以下實例:

program main;

begin
  Assert('Hello ' + 'World' = 'Hello World');
end.

Pascal 的字串處理比 C 高階一些,像是字串可以直接以運算子相接。

和集合 (Set) 相關的運算子

Pascal 內建集合型態,用簡單的運算子即可進行集合運算。我們會留在介紹集合時一併說明。

和指標 (Pointer) 相關的運算子

指標是用來操作記憶體的語法特性。我們留在介紹指標時一併說明。

運算子優先順序 (Operator Precedence)

在敘述中出現多個運算子時,會根據內建的運算子優先順序來決定運算子的執行順序。以下是 Object 官方的運算子優先順序:

但是,實際上程式設計者甚少在背誦運算子優先順序。因為:

  • 運算子的優先順序和數學上的概念相同
  • 藉由簡化敘述來簡化運算子的使用
  • 適度地用括號改變運算子優先順序
關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。