Operadores lógicos, relacionales y bit a bit

1 Los operadores lógicos son: and, or, not, xor

Estos operadores reciben valores booleanos como parámetros y su resultado también es booleano;

Cuando ambos operandos son números enteros, and/or/not/xor pasan a ser operadores bit a bit y devuelven un valor entero.

2 Operadores relacionales (de comparación): =, <>, >, <, <=, >=.

Si conoces los lenguajes de la familia C, debes diferenciar estos puntos:

En Pascal solo se usa un signo igual para comprobar igualdad: A = B (en C se usa A == B);

El operador de asignación propio de Pascal es el símbolo :=.

Los operadores lógicos / bit a bit tienen mayor precedencia que los operadores relacionales.

Para controlar el orden de cálculo, algunas expresiones deben envolverse entre paréntesis; de lo contrario habrá errores lógicos o fallos de compilación.

Ejemplo incorrecto (error de compilación)

var
  A, B: Integer;
begin
  if A = 0 and B <> 0 then ... // Escritura erróneaLenguaje del código: JavaScript (javascript)

Causa del fallo de compilación:

Las reglas de precedencia del compilador ejecutan primero la operación AND bit a bit central 0 and B (devuelve un entero);

Luego calcula A = (0 and B), obteniendo un valor booleano;

Finalmente el programa intenta operar entre un valor booleano y el entero 0, lo que provoca un error de incompatibilidad de tipos (type mismatch).

Forma correcta

var
  A, B: Integer;
begin
  if (A = 0) and (B <> 0) then ...Lenguaje del código: HTML, XML (xml)

Reglas de evaluación cortocircuitada (Short-circuit evaluation)

Tomemos como ejemplo la expresión if MyFunction(X) and MyOtherFunction(Y) then..., sus reglas son las siguientes:

  1. Operador and: se evalúa primero el lado izquierdo MyFunction(X)
    • Si el lado izquierdo devuelve false, el resultado completo de la expresión será obligatoriamente false, y la función derecha MyOtherFunction(Y) no se ejecutará en absoluto.
  2. El operador or funciona igual:
    • Si el lado izquierdo ya devuelve true, el resultado total es verdadero y el código derecho no se ejecuta.

Esta característica es muy útil para comprobaciones de puntero nulo:

if (A <> nil) and A.IsValid then...Lenguaje del código: HTML, XML (xml)

Incluso si A es el puntero nulo nil, el código no colapsa. La palabra clave nil representa el puntero nulo, equivale numéricamente a 0 y corresponde a null en otros lenguajes.

Clasificación de operadores

Operadores relacionales (devuelven Boolean)

PascalSignificadoEquivalente en C
=Igual a==
<>Diferente de!=
>Mayor que>
<Menor que<
>=Mayor o igual que>=
<=Menor o igual que<=

Operadores lógicos / bit a bit

not: Negación lógica / Complemento bit a bit and: Conjunción lógica / AND bit a bit or: Disyunción lógica / OR bit a bit xor: Disyunción exclusiva lógica / XOR bit a bit

not (negación)

anot a
truefalse
falsetrue

and (conjunción, solo verdadero si ambos operandos son verdaderos)

aba and b
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

or (disyunción, verdadero si al menos un operando es verdadero)

aba or b
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

xor (disyunción exclusiva, verdadero solo si los operandos son distintos)

aba xor b
truetruefalse
truefalsetrue
falsetruetrue
falsefalsefalse

Ejemplos

Reglas para determinar año bisiesto

  1. Divisible entre 4, pero no entre 100 → Año bisiesto
  2. Divisible entre 400 → Año bisiesto Los demás son años comunes
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program LeapYearCheck;

// Función para comprobar año bisiesto, recibe un año y devuelve 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('Ingrese el año:');
  ReadLn(y);

  if IsLeapYear(y) then
    Writeln(y, ' es año bisiesto')
  else
    Writeln(y, ' es año común');

  ReadLn;
end.Lenguaje del código: JavaScript (javascript)
  • mod operador de resto, year mod 4 = 0 significa que es divisible entre 4
  • Las expresiones requieren paréntesis: and tiene mayor precedencia que los operadores de comparación
  • Característica de cortocircuito: si la condición de divisibilidad entre 400 delante del or se cumple, no se evalúan las condiciones de 4/100

Operadores lógicos, relacionales y bit a bit

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *