Logische, relationale und Bitoperatoren

1 Logische Operatoren umfassen: and, or, not, xor

Diese Operatoren akzeptieren boolesche Werte als Parameter, das Ergebnis der Berechnung ist ebenfalls ein boolescher Wert;

Wenn beide Operanden Ganzzahlen sind, werden and/or/not/xor zu Bitoperatoren und liefern ein ganzzahliges Ergebnis.

2 Relationale (Vergleichs-)Operatoren: =, <>, >, <, <=, >=.

Wenn Sie mit Sprachen der C-Familie vertraut sind, achten Sie unbedingt auf folgende Unterschiede:

Für Gleichheitsprüfungen nutzt Pascal nur ein einzelnes Gleichheitszeichen A = B (C-Sprachen verwenden A == B);

Der spezielle Zuweisungsoperator von Pascal ist das Symbol :=.

Logische / Bitoperatoren haben eine höhere Auswertungspriorität als relationale Operatoren.

Um die Berechnungsreihenfolge zu steuern, müssen manche Ausdrücke mit Klammern umschlossen werden; sonst treten Logikfehler oder ein Kompilierfehler auf.

Falsches Beispiel (verursacht Kompilierfehler)

var
  A, B: Integer;
begin
  if A = 0 and B <> 0 then ... // Falsche SchreibweiseCode-Sprache: JavaScript (javascript)

Grund für den Kompilierfehler:

Nach den Prioritätsregeln des Compilers wird zuerst der mittlere Bit-AND-Vorgang 0 and B ausgeführt (liefert eine Ganzzahl);

Anschließend wird A = (0 and B) berechnet, wodurch ein boolescher Wert entsteht;

Zuletzt versucht das Programm eine Operation zwischen einem booleschen Wert und der Ganzzahl 0 durchzuführen, was einen Fehler durch Typenkonflikt (type mismatch) auslöst.

Korrekte Schreibweise

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

Regeln der Kurzschlussauswertung (Short-circuit evaluation)

Nehmen Sie den Ausdruck if MyFunction(X) and MyOtherFunction(Y) then... als Beispiel, die Regeln lauten wie folgt:

  1. and-Operation: Zuerst wird der linke Teilausdruck MyFunction(X) ausgeführt
    • Wenn der linke Teil false zurückgibt, ist das Ergebnis des gesamten Ausdrucks garantiert false, die rechte Funktion MyOtherFunction(Y) wird überhaupt nicht ausgeführt.
  2. Die or-Operation funktioniert analog:
    • Wenn der linke Teil bereits true liefert, ist das Gesamtergebnis wahr und der rechte Code wird nicht ausgeführt.

Diese Eigenschaft ist bei Nullpointer-Prüfungen äußerst praktisch:

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

Der Code stürzt nicht ab, selbst wenn A der Nullpointer nil ist. Das Schlüsselwort nil steht für den Nullpointer, ist numerisch gleich 0 und entspricht dem Schlüsselwort null in anderen Sprachen.

Klassifizierung der Operatoren

Relationale Operatoren (liefern Boolean-Werte)

PascalBedeutungC-Äquivalent
=Gleich==
<>Ungleich!=
>Größer als>
<Kleiner als<
>=Größer oder gleich>=
<=Kleiner oder gleich<=

Logische / Bitoperatoren

not: Logisches NICHT / Bit-Invertierung and: Logisches UND / Bit-UND or: Logisches ODER / Bit-ODER xor: Exklusives ODER / Bit-XOR

not NICHT

anot a
truefalse
falsetrue

and UND (nur wahr, wenn beide Operanden wahr sind)

aba and b
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

or ODER (wahr, wenn mindestens einer der Operanden wahr ist)

aba or b
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

xor Exklusives ODER (nur wahr, wenn die Operanden unterschiedliche Werte haben)

aba xor b
truetruefalse
truefalsetrue
falsetruetrue
falsefalsefalse

Beispiele

Regeln zur Schaltjahr-Erkennung

  1. Durch 4 teilbar, aber nicht durch 100 → Schaltjahr
  2. Durch 400 teilbar → Schaltjahr; alle übrigen Jahre sind Gemeinjahre
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program LeapYearCheck;

// Funktion zur Schaltjahrprüfung, nimmt Jahreszahl entgegen und gibt Boolean zurück
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('Geben Sie ein Jahr ein: ');
  ReadLn(y);

  if IsLeapYear(y) then
    Writeln(y, ' ist ein Schaltjahr')
  else
    Writeln(y, ' ist ein Gemeinjahr');

  ReadLn;
end.Code-Sprache: JavaScript (javascript)
  • mod Restoperator, year mod 4 = 0 bedeutet, dass das Jahr ohne Rest durch 4 teilbar ist
  • Ausdrücke müssen geklammert werden: Der and-Operator hat höhere Priorität als Vergleichsoperatoren
  • Kurzschluss-Eigenschaft: Wenn die Teilbarkeitsbedingung durch 400 vor dem or erfüllt ist, werden die Bedingungen für 4 und 100 nicht mehr geprüft

Logische, relationale und Bitoperatoren

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert