Vergleichs- und Logikoperationen

Vergleichs- und Logikoperatoren werden hauptsächlich in Verzweigungen und Programmschleifen eingesetzt, die später behandelt werden. Beide Operatorgruppen liefern als Ergebnis den bool-Wert true oder false zurück.

Vergleichsoperationen

Folgende Vergleichsoperationen stehen zur Verfügung:

Operator Syntax Ergebnis
< EXP1 < EXP2 true, wenn EXP1 kleiner als EXP2
> EXP1 > EXP2; true, wenn EXP1 größer als EXP2
== EXP1 == EXP2; true, wenn EXP1 gleich EXP2
!= EXP1 != EXP2; true, wenn EXP1 ungleich EXP2
<= EXP1 <= EXP2; true, wenn EXP1 kleiner oder gleich EXP2
>= EXP1 >= EXP2; true, wenn EXP1 größer oder gleich EXP2

Beachten Sie, dass der GLEICH-Operator aus zwei Zuweisungszeichen == besteht! Dies ist eine häufige Fehlerquelle.

Außer den aufgeführten Vergleichsoperatoren gibt es den 3-Wege-Vergleichsoperator <=>, auch spaceship-Operator genannt. Da dieser Operand nur im Zusammenhang mit Objekten sinnvoll ist, wird er erst später im Kapitel Allgemeines Überladen von Operatoren behandelt.

Logikoperationen

Zum Verknüpfen von Bedingungen (in der Regel sind dies Ergebnisse von Vergleichsoperationen) stehen folgende Operatoren zur Verfügung:

Operator Syntax Ergebnis
&& EXP1 && EXP2; true, wenn EXP1 und EXP2 gleich true
|| EXP1 || EXP2; true, wenn EXP1 oder EXP2 gleich true
! !EXP true, wenn EXP false ist

Beachten Sie, dass die Logikoperatoren UND und ODER wieder aus zwei Symbolen && bzw. || bestehen. Verwechseln Sie die Logikoperatoren nicht mit den Bitoperatoren UND bzw. ODER, die jeweils nur ein Symbol & bzw. | besitzen. So liefert die Auswertung

EXP1 | EXP2

als Ergebnis eine Bitkombination aus den beiden Operanden (Veroderung), während die Auswertung des Ausdrucks

EXP1 || EXP2

ein boolsches Ergebnis (true oder false) liefert, je nachdem, ob mindestens eine der Bedingungen true ist.

Die Anzahl der Ausdrücke, die in einer Anweisung mit den Logikoperatoren verknüpft werden können, ist nicht begrenzt.

ERG = OP1 && OP2 || OP3 && OP4;

Der Übersichtlichkeit wegen sollten nicht allzu viele Ausdrücke in einer Anweisung verknüpft werden. In welcher Reihenfolge eine solche Anweisung ausgewertet wird, d.h., ob die Und-Verknüpfung vor der Oder-Verknüpfung berechnet wird oder nicht, ist Thema des nächsten Kapitels.

Anpassung der Datentypen der Operanden

Sind die Datentypen der Operanden verschieden, werden sie auf einen gemeinsamen Datentyp konvertiert. Mehr dazu im Kapitel Typkonvertierungen(Promotions). Dabei kann es unter Umständen zu nicht beabsichtigten Nebeneffekten kommen. Sehen Sie sich einmal das Beispiel an.

#include <print>
int main ()
{
    signed char var = 0x80;
    std::println("var == 0x80 ->{}", var==0x80);
}

var == 0x80 ->false

Hier wird eine signed char-Variable mit dem Literal 0x80 verglichen. Obwohl dieser Vergleich auf den ersten Blick true als Ergebnis liefern sollte, ist das Ergebnis des Vergleichs false. Der Grund hierfür liegt darin, dass das Literal standardmäßig den Datentyp int besitzt. Und damit wird der signed char-Wert der Variable vor dem Vergleich auf einen int-Wert konvertiert. Und diese Konvertierung erfolgt unter Beachtung des Vorzeichens des signed char-Werts. Da alle signed char-Werte größer/gleich 0x80 negativ sind (7. Bit ist Vorzeichenbit!), ergibt sich folgender Vergleich:

0xFFFFFF80 == 0x00000080

oder in dezimal:

-80== 128

Ferner sollten Sie beim Vergleichen von Gleitkommadaten den folgenden Satz niemals vergessen:

Vergleichen Sie Gleitkommadaten niemals auf Gleichheit! Beim Rechnen mit Gleitkommadaten ist immer mit Rundungsfehlern zu rechnen. So kann die Auswertung des Ausdrucks (1.1 / 3.) ein leicht anderes Ergebnis liefern als (22. / (3. * 20.)).