論理演算子、関係演算子、ビット演算子

1 論理演算子には以下が含まれます:andornotxor

これらの演算子は真偽値を引数として受け取り、演算結果も真偽値となります;

両辺のオペランドが整数の場合、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... の式を例にルールを説明します:

  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の判定は実行されない

論理演算子、関係演算子、ビット演算子

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です