前言
在程式語言中,運算子是最基本的指令,無法再拆分成更簡約的形式。本文介紹 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 官方的運算子優先順序:
但是,實際上程式設計者甚少在背誦運算子優先順序。因為:
- 運算子的優先順序和數學上的概念相同
- 藉由簡化敘述來簡化運算子的使用
- 適度地用括號改變運算子優先順序