C++ Kurs

Vergleichs- und Logikoperationen

Die Themen:

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

HinweisC++ interpretiert bei Vergleichsoperationen jeden numerischen Wert ungleich 0 als true und den Wert 0 als false.

Vergleichsoperationen

Zum Vergleichen von zwei Operanden stehen folgende Vergleichsoperationen zur Verfügung:

KLEINER-ALS Operation

Der Operator < vergleicht zwei Operanden auf kleiner.

ERG = OP1 < OP2;

Er liefert als Ergebnis true, wenn die Auswertung von OP1 einen kleineren Wert liefert als die Auswertung von OP2. In allen anderen Fällen ist das Ergebnis false.

GRÖSSER-ALS Operation

Der Operator > vergleicht zwei Operanden auf größer.

ERG = OP1 > OP2;

Er liefert als Ergebnis true, wenn die Auswertung von OP1 einen größeren Wert liefert als die Auswertung von OP2. In allen anderen Fällen ist das Ergebnis false.

GLEICH Operation

Der Operator == vergleicht zwei Operanden auf Gleichheit.

ERG = OP1 == OP2;

Er liefert als Ergebnis true, wenn die Auswertung von OP1 exakt den gleichen Wert liefert wie die Auswertung von OP2. In allen anderen Fällen ist das Ergebnis false.

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

UNGLEICH Operation

Der Operator != vergleicht zwei Operanden auf ungleich.

ERG = OP1 != OP2;

Er liefert als Ergebnis true, wenn die Auswertung von OP1 einen unterschiedlichen Wert liefert als die Auswertung von OP2. In allen anderen Fällen ist das Ergebnis false.

KLEINER-GLEICH Operation

Der Operator <= vergleicht zwei Operanden auf kleiner-gleich.

ERG = OP1 <= OP2;

Er liefert als Ergebnis true, wenn die Auswertung von OP1 einen kleineren oder den gleichen Wert liefert als die Auswertung von OP2. In allen anderen Fällen ist das Ergebnis false.

GRÖSSER-GLEICH Operation

Der Operator >= vergleicht zwei Operanden auf größer-gleich.

ERG = OP1 >= OP2;

Er liefert als Ergebnis true, wenn die Auswertung von OP1 einen größeren oder den gleichen Wert liefert als die Auswertung von OP2. In allen anderen Fällen ist das Ergebnis false.

Anpassung der Datentypen der Operanden

Da es auch unter C++ nicht möglich ist, Äpfel mit Birnen zu vergleichen, werden vor einem Vergleich die beiden Operanden bei ungleichen Datentypen auf einen gemeinsamen Datentyp konvertiert. Ohne auf die genaue Konvertierung näher einzugehen, wird in der Regel der kleinere Datentyp an den größeren angepasst. Hierdurch kann es unter Umständen zu nicht beabsichtigten Nebeneffekten kommen. Sehen Sie sich dazu einmal das Beispiel an.

Anweisungen:

signed char var = 0x80;
....
bool res = (var == 0x80);

Ergebnis:

res ist false!! Die Variable var wird zuerst vorzeichenrichtig auf den Typ int konvertiert und damit ergibt sich folgender Vergleich:
    0x00000080 == 0xFFFFFF80
oder in dezimal:
    128 == -80

Hier wird versucht, eine signed char-Variable mit dem int-Literal 0x80 zu vergleichen. 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 dann der oben dargestellte Vergleich.

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

AchtungVergleichen Sie Gleitkommazahlen niemals auf Gleichheit!

Beim Rechnen mit Gleitkommazahlen muss immer mit eventuellen Rundungsfehlern gerechnet werden. So kann die Auswertung des Ausdrucks (1.1 / 3.) ein anderes Ergebnis liefern wie (22. / (3. * 20.)).

Logikoperationen

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

UND Operation

Der logische UND-Operator besitzt das Symbol && und hat folgende Syntax:

ERG = OP1 && OP2;

Er liefert als Ergebnis true, wenn die Auswertung von OP1 und OP2 den 'Wert' true ergibt. In allen anderen Fällen ist das Ergebnis false.

ODER Operation

Der logische ODER-Operator besitzt das Symbol || und hat folgende Syntax:

ERG = OP1 || OP2;

Er liefert als Ergebnis true, wenn die Auswertung von OP1 oder OP2 den 'Wert' true ergibt. In allen anderen Fällen ist das Ergebnis false.

NOT Operation

Der logische NOT-Operator besitzt das Symbol ! (Ausrufezeichen) und hat folgende Syntax:

ERG = !OP;

Er liefert als Ergebnis true, wenn die Auswertung von OP false liefert und false wenn OP gleich true ist.

Achtung

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

OP1 | OP2

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

OP1 || OP2

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

Verkettung von Logikoperationen

Die Anzahl der Operationen, die in einer Anweisung mit den Logikoperatoren verknüpft werden können, ist nicht begrenzt, d.h. es können beliebig viele Operationen miteinander verkettet werden.

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

Jedoch sollten wegen der Übersichtlichkeit nicht allzu viele Operationen in einer Anweisung verknüpft werden. In welcher Reihenfolge ein solcher Ausdruck ausgewertet wird, das ist Thema des nächsten Kapitels.