1 논리 연산자에는 다음이 포함됩니다:and、or、not、xor
이런 연산자는 불리언 값을 인자로 받으며 연산 결과 역시 불리언 값을 반환합니다;
양쪽 피연산자가 정수일 경우 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... 표현식을 예시로 규칙은 다음과 같습니다:
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에 해당합니다.
연산자 분류
관계 연산자 (Boolean 반환)
| Pascal | 의미 | C 동등 표기 |
|---|---|---|
= | 같다 | == |
<> | 다르다 | != |
> | 크다 | > |
< | 작다 | < |
>= | 크거나 같다 | >= |
<= | 작거나 같다 | <= |
논리 / 비트 연산자
not:논리 부정 / 비트 반전 and:논리곱 / 비트 AND or:논리합 / 비트 OR xor:배타적 논리합 / 비트 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 조건은 검사하지 않음
논리, 관계 및 비트 연산자