邏輯、關係與位元運算子

1 邏輯運算子包含:andornotxor

此類運算子接收布林值做為參數,運算結果同樣為布林值;

若兩側運算元皆為整數,and/or/not/xor 會轉為位元運算子,運算結果為整數。

2 關係(比較)運算子:=<>><<=>=

如果你熟悉 C 系列語言,請務必留意以下差異:

Pascal 判斷相等僅使用單一等號 A = B(C 語言使用 A == B);

Pascal 的指定運算子為專用符號 :=

邏輯/位元運算子的運算優先權高於關係運算子

若要控制計算順序,部分運算式必須使用括號包覆,否則會發生邏輯錯誤甚至編譯失敗。

錯誤範例(編譯報錯)

var
  A, B: Integer;
begin
  if A = 0 and B <> 0 then ... // 錯誤寫法Code language: JavaScript (javascript)

編譯失敗原因:

編譯器優先權規則會先執行中間的位元及運算 0 and B(結果為整數);

接著執行 A = (0 and B),得到布林值;

最後程式嘗試將布林值與整數 0 進行運算,觸發型別不相符(type mismatch)錯誤。

正確寫法

var
  A, B: Integer;
begin
  if (A = 0) and (B <> 0) then ...Code language: HTML, XML (xml)

短路求值規則(Short-circuit evaluation)

以運算式 if MyFunction(X) and MyOtherFunction(Y) then... 為例,規則如下:

  1. and 運算:優先執行左側 MyFunction(X)
    • 若左側回傳 false,整個運算式結果必定為 false,右側函式 MyOtherFunction(Y) 完全不會執行
  2. or 運算同理:
    • 若左側已回傳 true,整體結果一定為真,右側程式碼不再執行。

此特性在空指標判斷時非常實用:

if (A <> nil) and A.IsValid then...Code language: HTML, XML (xml)

即便 A 是空指標 nil,程式也不會崩潰。關鍵字 nil 代表空指標,數值層面等同 0,對應其他語言的 null。

運算子分類

關係運算子(回傳布林值)

Pascal含義C 對應寫法
=等於==
<>不等於!=
>大於>
<小於<
>=大於等於>=
<=小於等於<=

邏輯/位元運算子

not:邏輯非/位元反轉 and:邏輯及/位元及 or:邏輯或/位元或 xor:邏輯互斥或/位元互斥或

not 非

anot a
truefalse
falsetrue

and 及(兩者皆真才為真)

aba and b
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

or 或(任一為真即為真)

aba or b
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

xor 互斥或(兩側值不同才為真)

aba xor b
truetruefalse
truefalsetrue
falsetruetrue
falsefalsefalse

範例

閏年判斷規則

  1. 可被 4 整除,但無法被 100 整除 → 閏年
  2. 可被 400 整除 → 閏年 其餘皆為平年
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program LeapYearCheck;

// 判斷閏年函式,輸入年份,回傳布林值
function IsLeapYear(year: Integer): Boolean;
begin
  Result := ((year mod 4 = 0) and (year mod 100 <> 0)) or (year mod 400 = 0);
end;

var
  y: Integer;
begin
  Write('請輸入年份:');
  ReadLn(y);

  if IsLeapYear(y) then
    Writeln(y, ' 是閏年')
  else
    Writeln(y, ' 是平年');

  ReadLn;
end.Code language: JavaScript (javascript)
  • mod 取餘運算子,year mod 4 = 0 代表可被 4 整除
  • 運算式必須加上括號:and 優先權高於比較運算子
  • 短路特性:若 or 前方符合 400 整除條件,便不會再執行 4/100 的判斷

邏輯、關係與位元運算子

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *