논리, 관계 및 비트 연산자

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)

컴파일 실패 원인:

컴파일러 우선순위 규칙에 따라 중간 비트 AND 연산 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에 해당합니다.

연산자 분류

관계 연산자 (Boolean 반환)

Pascal의미C 동등 표기
=같다==
<>다르다!=
>크다>
<작다<
>=크거나 같다>=
<=작거나 같다<=

논리 / 비트 연산자

not:논리 부정 / 비트 반전 and:논리곱 / 비트 AND or:논리합 / 비트 OR xor:배타적 논리합 / 비트 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 조건은 검사하지 않음

논리, 관계 및 비트 연산자

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다