논리 연산자

논리 연산자

and, or, xor, not 같은 논리 연산자도 오버로드할 수 있어요. 단순 타입에서는 보통 boolean 연산이나 비트 단위 연산으로 쓰이지만, 오버로드하면 결과 타입을 자유롭게 정할 수 있습니다.

출처: 문서

본문

논리 연산자 and, or, xor, not는 오버로드할 수 있어요. 이 연산자들은 보통 단순 타입에 두 가지 방식으로 사용됩니다.

  • boolean 연산자로 — 이 경우 결과는 boolean이에요. (not는 예외)
  • 비트 단위(bitwise) 연산자로 — 이 경우 결과는 서수(ordinal) 타입이에요.

이 연산자들을 오버로드할 때 결과 타입은 제한되지 않습니다. 즉 boolean 논리 연산자로 정의할 수 있어요.

Type
  Rec = record
    a,b : Boolean;
  end;
Operator and (r1,r2 : Rec) z : boolean;
begin
  z:=(R1.a and R2.a) or (R1.b and r2.b);
end;
Operator or (r1,r2 : Rec) z : Boolean;
begin
  z:=(R1.a or R2.a) and (R1.b or r2.b)
end;
Operator xor (r1,r2 : Rec) z : Boolean;
begin
  z:=(R1.a xor R2.a) and (R1.b xor r2.b)
end;
Operator not (r1 : Rec) z : rec;
begin
  z.A:=not R1.a;
  z.B:=not R1.b;
end;
var
r1,r2 : Rec;
begin
  Writeln(r1 and r2);
  Writeln(r1 or r2);
  Writeln(r1 xor r2);
  Writeln((not r1).a);
end.

서로 다른 반환 타입을 갖는 것도 가능해요.

Operator and (r1,r2 : Rec) z : string;
begin
  Str(Ord((R1.a and R2.a) or (R1.b and r2.b)),Z);
end;

컴파일러는 항상 반환 타입을 확인해서 표현식의 최종 타입을 결정하고, 할당은 타입 안전성 검사를 받게 됩니다.

더 알아보기