Menu

C++-Operatoren: arithmetisch, Vergleich, logisch und mehr

Lerne die C++-Operatoren kennen - arithmetische, Vergleichs-, logische, Zuweisungs- und Bit-Operatoren - sowie die Fallstricke rund um Ganzzahldivision, Vorrang und Kurzschlussauswertung.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Was Operatoren tun

Ein Operator ist ein Symbol, das eine Aktion auf einem oder mehreren Werten ausführt, den sogenannten Operanden. Einen hast du bereits benutzt: das =, das einen Wert an eine Variable bindet. C++ bringt einen reichhaltigen Satz an Operatoren für Mathematik, Vergleiche, Logik und Bitmanipulation mit - sowie ein paar scharfe Kanten, über die Einsteiger stolpern.

Auf der vorherigen Seite hast du gesehen, wie const einen Wert festschreibt. Operatoren sind die Art und Weise, wie du die Werte berechnest, die du speicherst - ob konstant oder nicht. Gehen wir die Familien durch, die du jeden Tag verwenden wirst.

Arithmetische Operatoren

Die fünf arithmetischen Operatoren sind +, -, *, / und % (Modulo, der Rest einer Division):

Der große Fallstrick steckt in diesem Quotienten. 17 / 5 gibt 3 aus, nicht 3.4. Wenn beide Operanden Ganzzahlen sind, führt / eine Ganzzahldivision durch und wirft den Nachkommateil weg - es schneidet Richtung null ab, es rundet nicht. Wenn du einen echten Bruch willst, muss mindestens ein Operand ein Gleitkommawert sein:

Der %-Operator funktioniert nur mit Ganzzahlen. % auf einem double zu verwenden ist ein Kompilierfehler - nutze std::fmod aus <cmath> für Gleitkomma-Reste.

Zuweisung und zusammengesetzte Operatoren

Ein einzelnes = weist zu; es vergleicht nicht. C++ bietet dir zusammengesetzte Formen, die eine Operation mit der Zuweisung kombinieren, damit du den Variablennamen nicht wiederholen musst:

Ein klassischer, schmerzhafter Fehler ist, in einer Bedingung = zu schreiben, wo du == meintest. if (x = 0) weist x den Wert 0 zu und prüft dann das Ergebnis (das falsch ist), anstatt zu vergleichen. Moderne Compiler warnen davor, wenn du Warnungen einschaltest - lass -Wall aktiviert und nimm die Warnung ernst.

Vergleichsoperatoren

Vergleichsoperatoren stellen eine Ja/Nein-Frage und liefern einen bool (true oder false):

Standardmäßig gibt cout einen bool als 1 oder 0 aus. Schreibe boolalpha einmal in den Stream, und er wechselt für den Rest dieses Streams zu den Wörtern true/false.

Eine subtile Falle: Verkette keine Vergleiche wie 1 < x < 10. Das wird als (1 < x) < 10 ausgewertet - der erste Vergleich liefert einen bool (0 oder 1), der dann mit 10 verglichen wird, sodass das Ganze fast immer true ist. Schreibe stattdessen 1 < x && x < 10.

Logische Operatoren und Kurzschlussauswertung

&& (und), || (oder) und ! (nicht) verknüpfen boolesche Ausdrücke. Die ersten beiden werten kurzgeschlossen aus: Die Auswertung stoppt, sobald das Ergebnis feststeht.

Weder check("A") noch check("B") wird jemals ausgeführt - das ist Kurzschlussauswertung. Sie ist nicht nur eine Optimierung; sie ist ein Werkzeug. Du kannst gefahrlos if (ptr != nullptr && ptr->ready) schreiben, weil der Teil ptr->ready nur erreicht wird, wenn ptr nicht null ist, was das Dereferenzieren eines ungültigen Zeigers vermeidet.

Inkrement und Dekrement

++ addiert eins; -- subtrahiert eins. Jeder hat eine Präfix- und eine Postfix-Form, und der Unterschied zählt, wenn du das Ergebnis verwendest:

Wenn du nur den Seiteneffekt willst (etwa in einer for-Schleife), bevorzuge ++i. Für ein einfaches int ist es identisch, aber bei schwereren Typen wie Iteratoren muss das Postinkrement zuerst den alten Wert kopieren, was verschwendete Arbeit ist.

Noch eine Warnung: Ändere dieselbe Variable nicht zweimal in einem einzigen Ausdruck, etwa i = i++ + 1; oder arr[i] = i++;. Die Reihenfolge dieser Aktualisierungen ist nicht festgelegt und das Ergebnis ist undefiniertes Verhalten. Beschränke jede Variable auf eine einzige Änderung pro Anweisung.

Bit-Operatoren und Vorrang

Für Low-Level-Arbeit gibt es Bit-Operatoren: & (und), | (oder), ^ (xor), ~ (nicht) sowie die Verschiebungen << und >>.

Achtung: << und >> sind auch die Stream-Operatoren auf cout. Innerhalb einer cout-Zeile brauchst du um eine Bitverschiebung normalerweise Klammern, sonst liest der Compiler sie als Stream-Einfügung.

Zuletzt entscheidet der Vorrang, was zuerst bindet, wenn du Operatoren mischst. * und / binden stärker als + und -, genau wie in der Mathematik, also ist 2 + 3 * 4 gleich 14. Vergleiche binden schwächer als Arithmetik, und die logischen &&/|| noch schwächer. Im Zweifel die ganze Tabelle nicht auswendig lernen - setze Klammern. (a + b) * c ist klarer, als sich darauf zu verlassen, dass der Leser die Regeln kennt.

Als Nächstes: Typumwandlung

Du hast oben gesehen, dass (double)a / b eine Ganzzahl in eine Gleitkommadivision gezwungen hat. Das ist eine Umwandlung (Cast) - ein Wert wird bewusst von einem Typ in einen anderen umgewandelt. Auf der nächsten Seite behandeln wir die Umwandlungswerkzeuge von C++, von impliziten Promotions bis static_cast, und wann welches sicher ist.

Häufig gestellte Fragen

Welche Operatoren gibt es in C++?

C++ gruppiert Operatoren in arithmetische (+ - * / %), Vergleichs- (== != < > <= >=), logische (&& || !), Zuweisungs- (= += -= ...), Inkrement-/Dekrement- (++ --) und Bit-Operatoren (& | ^ ~ << >>). Außerdem gibt es den ternären ?: und einige weitere wie sizeof.

Warum ergibt 5 / 2 in C++ den Wert 2?

Weil beide Operanden int sind, führt / eine Ganzzahldivision durch und der Nachkommateil wird verworfen - nicht gerundet. Um 2.5 zu erhalten, mache mindestens einen Operanden zu einem Gleitkommawert: 5.0 / 2 oder 5 / 2.0.

Was ist der Unterschied zwischen ++i und i++ in C++?

Beide addieren 1 zu i. ++i (Präinkrement) erhöht zuerst und liefert den neuen Wert; i++ (Postinkrement) liefert den alten Wert und erhöht dann. Wenn dich nur der Seiteneffekt interessiert, bevorzuge ++i.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S