C++ Kurs

Vergleichs- und Logikoperationen

Die Themen:

Einleitung
Vergleichsoperationen
Logikoperationen

Einleitung

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

In C++ wird bei Vergleichsoperationen jeder numerische Wert ungleich 0 als true interpretiert und der Wert 0 als false.

Vergleichsoperationen

Vor einem Vergleich von zwei Operanden werden bei unterschiedlichen Datentypen der Operanden diese stets auf einen gemeinsamen Datentyp konvertiert. Wie diese Konvertierung prinzipiell vonstatten geht, folgt noch.

Zum Vergleichen von Operanden (Werte) stehen folgende Vergleichsoperationen zur Verfügung:

KLEINER-ALS Operation

Der Operator < vergleicht zwei Operanden auf kleiner.

ergebnis = operand1 < operand2;

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

GRÖSSER-ALS Operation

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

ergebnis = operand1 > operand2;

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

GLEICH Operation

Der Operator == vergleicht zwei Operanden auf Gleichheit.

ergebnis = operand1 == operand2;

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

Beachten Sie unbedingt, dass der GLEICH-Operator aus zwei Zuweisungszeichen == besteht! Dies ist eine häufige Fehlerquelle. Mehr dazu später im Kurs bei der IF-Abfrage.

UNGLEICH Operation

Der Operator != vergleicht zwei Operanden auf Ungleichheit.

ergebnis = operand1 != operand2;

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

KLEINER-GLEICH Operation

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

ergebnis = operand1 <= operand2;

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

GRÖSSER-GLEICH Operation

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

ergebnis = operand1 >= operand2;

Er liefert als Ergebnis true, wenn die Auswertung von operand1 einen größeren oder den gleichen Wert liefert wie die Auswertung von operand2. 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:

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 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 char-Wert der Variable vor dem Vergleich auf einen int-Wert konvertiert. Und diese Konvertierung erfolgt unter Beachtung des Vorzeichens des char-Werts. Da alle 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:

Vergleichen Sie Gleitkommazahlen niemals auf Gleichheit!

Beim Rechnen mit Gleitkommazahlen müssen Sie immer mit eventuellen Rundungsfehlern rechnen. 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: 

ergebnis = operand1 && operand2;

Er liefert als Ergebnis true, wenn die Auswertung von operand1 und operand2 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: 

ergebnis = operand1 || operand2;

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

NOT Operation

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

ergebnis = !operand;

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

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

operand1 | operand2

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

operand1 || operand2

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

Verkettung von Logikoperationen

Die Anzahl der Operanden, die Sie in einer Anweisung mit den Logikoperatoren verknüpfen können, ist nicht begrenzt, d.h Sie können beliebig viele Operanden verketten.

ergebnis = operand1 && operand2 || operand3 && operand4;

Jedoch sollten Sie aus Gründen der Übersichtlichkeit nicht all zu viele Operanden in einer Anweisung verketten. In welcher Reihenfolge ein solcher Ausdruck ausgewertet wird, das erfahren Sie in der nächsten Lektion.

Ein Beispiel oder eine Übung entfällt in dieser Lektion, da die Vergleichs- und Logikoperationen erst im Zusammenspiel mit Verzweigungen Sinn machen.