1 論理演算子には以下が含まれます:and、or、not、xor
これらの演算子は真偽値を引数として受け取り、演算結果も真偽値となります;
両辺のオペランドが整数の場合、and/or/not/xor はビット演算子として動作し、演算結果は整数になります。
2 関係(比較)演算子:=、<>、>、<、<=、>=。
C系言語に慣れている方は、以下の違いに注意してください:
Pascal では等値判定にイコール記号1つ 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... の式を例にルールを説明します:
and演算:左辺のMyFunction(X)から実行- 左辺が
falseを返した場合、式全体の結果は必ずfalseとなり、右辺の関数MyOtherFunction(Y)は一切実行されません。
- 左辺が
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 否定
| a | not a |
|---|---|
| true | false |
| false | true |
and 論理積(両方真の時のみ真)
| a | b | a and b |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
or 論理和(どちらか一方が真なら真)
| a | b | a or b |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
xor 排他的論理和(値が異なる時のみ真)
| a | b | a xor b |
|---|---|---|
| true | true | false |
| true | false | true |
| false | true | true |
| false | false | false |
例
閏年判定ルール
- 4で割り切れるが100で割り切れない → 閏年
- 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の判定は実行されない
論理演算子、関係演算子、ビット演算子