[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 官方的運算子優先順序:

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

    • 運算子的優先順序和數學上的概念相同
    • 藉由簡化敘述來簡化運算子的使用
    • 適度地用括號改變運算子優先順序
    【分享文章】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email
    【追蹤網站】
    Facebook Facebook Twitter Plurk