Operadores lógicos, relacionais e bit a bit

1 Os operadores lógicos compreendem: and, or, not, xor

Estes operadores recebem valores booleanos como argumentos e o resultado da operação também é booleano;

Quando ambos os operandos são inteiros, and/or/not/xor tornam-se operadores bit a bit, retornando um valor inteiro.

2 Operadores relacionais (de comparação): =, <>, >, <, <=, >=.

Se você tem familiaridade com linguagens da família C, é fundamental diferenciar os pontos abaixo:

No Pascal, a comparação de igualdade usa apenas um sinal de igual A = B (linguagens C utilizam A == B);

O operador de atribuição exclusivo do Pascal é o símbolo :=.

Os operadores lógicos / bit a bit têm precedência maior que os operadores relacionais.

Para controlar a ordem dos cálculos, algumas expressões devem ser envolvidas por parênteses; caso contrário, ocorrerão erros lógicos ou falhas na compilação.

Exemplo incorreto (erro de compilação)

var
  A, B: Integer;
begin
  if A = 0 and B <> 0 then ... // Forma incorretaCode language: JavaScript (javascript)

Motivo da falha na compilação:

As regras de precedência do compilador executam primeiro a operação AND bit a bit intermediária 0 and B (retorna inteiro);

Depois calcula A = (0 and B), gerando um valor booleano;

Por fim, o programa tenta realizar uma operação entre um booleano e o inteiro 0, causando um erro de incompatibilidade de tipos (type mismatch).

Forma correta

var
  A, B: Integer;
begin
  if (A = 0) and (B <> 0) then ...Code language: HTML, XML (xml)

Regra de avaliação curto-circuito (Short-circuit evaluation)

Tomando como exemplo a expressão if MyFunction(X) and MyOtherFunction(Y) then..., as regras são as seguintes:

  1. Operação and: executa primeiro o lado esquerdo MyFunction(X)
    • Se o lado esquerdo retornar false, o resultado de toda a expressão será obrigatoriamente false, e a função da direita MyOtherFunction(Y) não será executada de forma alguma.
  2. A operação or segue o mesmo princípio:
    • Se o lado esquerdo já retornar true, o resultado total é verdadeiro e o código da direita não é executado.

Essa característica é muito útil para validação de ponteiro nulo:

if (A <> nil) and A.IsValid then...Code language: HTML, XML (xml)

Mesmo que A seja o ponteiro nulo nil, o código não irá travar. A palavra-chave nil representa ponteiro nulo, numericamente equivalente a 0, correspondente ao null de outras linguagens.

Classificação dos operadores

Operadores relacionais (retornam Boolean)

PascalSignificadoEquivalente em C
=Igual a==
<>Diferente de!=
>Maior que>
<Menor que<
>=Maior ou igual a>=
<=Menor ou igual a<=

Operadores lógicos / bit a bit

not: Negação lógica / Complemento bit a bit and: Conjunção lógica / AND bit a bit or: Disjunção lógica / OR bit a bit xor: Disjunção exclusiva lógica / XOR bit a bit

not (negação)

anot a
truefalse
falsetrue

and (conjunção: só verdadeiro se ambos forem verdadeiros)

aba and b
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

or (disjunção: verdadeiro se pelo menos um for verdadeiro)

aba or b
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

xor (disjunção exclusiva: verdadeiro apenas se os valores forem diferentes)

aba xor b
truetruefalse
truefalsetrue
falsetruetrue
falsefalsefalse

Exemplos

Regras de identificação de ano bissexto

  1. Divisível por 4, mas não por 100 → Ano bissexto
  2. Divisível por 400 → Ano bissexto Os demais são anos comuns
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program LeapYearCheck;

// Função que verifica ano bissexto, recebe ano e retorna booleano
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('Informe o ano:');
  ReadLn(y);

  if IsLeapYear(y) then
    Writeln(y, ' é ano bissexto')
  else
    Writeln(y, ' é ano comum');

  ReadLn;
end.Code language: JavaScript (javascript)
  • mod operador de resto, year mod 4 = 0 significa divisível por 4
  • Expressões exigem parênteses: and tem precedência superior aos operadores de comparação
  • Característica curto-circuito: se a condição de divisibilidade por 400 antes do or for atendida, as condições de 4/100 não serão avaliadas

Operadores lógicos, relacionais e bit a bit

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *