Entscheidungen treffen mit if
Programme reagieren ständig auf Daten: bestanden oder durchgefallen, auf Lager oder ausverkauft, gültig oder nicht. Die if-Anweisung ist die Art und Weise, wie C++ anhand einer Bedingung auswählt, welcher Code ausgeführt wird.
Ein if nimmt eine Bedingung in Klammern und führt den Block in geschweiften Klammern nur dann aus, wenn diese Bedingung wahr ist:
Die Bedingung score >= 60 ist wahr, also wird die Nachricht ausgegeben. Die Zeile nach der schließenden geschweiften Klammer läuft immer - sie steht außerhalb des if. Ändere score auf 40, und die Zeile mit „passed“ wird komplett übersprungen.
Die Bedingung wird in bool umgewandelt. Vergleiche wie >, >=, ==, != liefern bereits einen bool, aber C++ behandelt auch jede Zahl ungleich null als wahr und 0 als falsch - so bedeutet if (count) „wenn count nicht null ist“. Diese implizite Umwandlung ist praktisch, aber auch die Quelle einiger klassischer Fehler, die du weiter unten siehst.
Ein else hinzufügen
else gibt dir den „andernfalls“-Pfad - Code, der nur ausgeführt wird, wenn die Bedingung falsch ist:
Genau einer der beiden Blöcke läuft - nie beide, nie keiner. Das else hat keine eigene Bedingung; es fängt einfach alles auf, was das if nicht erfasst hat.
Verketten mit else if
Wenn es mehr als zwei Ausgänge gibt, verkette die Bedingungen mit else if. C++ prüft sie von oben nach unten und führt den ersten Block aus, dessen Bedingung wahr ist, und überspringt dann den Rest:
Die Reihenfolge ist entscheidend. Weil 84 zuerst gegen >= 90 (falsch) und dann gegen >= 80 (wahr) getestet wird, stoppt es bei B und prüft die unteren Grenzen nie. Deshalb brauchst du auch kein score >= 80 && score < 90 - das Erreichen des zweiten Zweigs garantiert bereits, dass score unter 90 lag. Stelle deine engste oder höchstprioritäre Bedingung an den Anfang.
Beachte, dass es in C++ kein Schlüsselwort elif gibt - else if ist wörtlich ein else, dessen Körper ein weiteres if ist. Die geschweiften Klammern lassen es lediglich wie eine einzige Leiter lesen.
Eine große Stolperfalle: = gegen ==
Der mit Abstand häufigste if-Anweisungsfehler in C und C++ ist, = (Zuweisung) zu schreiben, wo man == (Vergleich) meinte:
x = 5 weist x den Wert 5 zu, und der gesamte Ausdruck ergibt 5, was zu true umgewandelt wird - also läuft der Zweig immer und du hast x stillschweigend überschrieben. Das kompiliert; die meisten Compiler geben nur eine Warnung aus. Zwei Schutzmaßnahmen: Schalte Warnungen ein (-Wall), damit der Compiler es meldet, und erwäge, die Konstante an den Anfang zu stellen - if (5 == x) - denn if (5 = x) ist ein harter Fehler, den der Compiler sofort fängt.
Dieselbe Falle versteckt sich bei bool: if (ready = true) kompiliert und weist zu, während if (ready == true) (oder einfach if (ready)) vergleicht.
Bedingungen kombinieren und verschachteln
Kombiniere Bedingungen mit && (und), || (oder) und ! (nicht), oder verschachtele ein if in einem anderen, wenn eine Prüfung erst sinnvoll ist, nachdem eine vorherige bestanden wurde:
&& und || arbeiten mit Kurzschlussauswertung: Bei a && b wertet C++ b nie aus, wenn a falsch ist. Das ist unerlässlich, um sich gegen fehlerhafte Speicherzugriffe abzusichern - if (ptr != nullptr && ptr->ready) ist sicher, weil die Dereferenzierung übersprungen wird, wenn ptr null ist. Bevorzuge nach Möglichkeit das Abflachen mit && gegenüber tiefer Verschachtelung; eine flache Bedingung liest sich klarer als eine Pyramide aus geschweiften Klammern.
Hüte dich vor Vergleichsverkettungen, die nicht das bedeuten, wonach sie aussehen: if (0 < x < 10) testet keinen Bereich. Es wertet 0 < x zu einem bool (0 oder 1) aus und vergleicht das dann mit 10 - immer wahr. Schreibe stattdessen if (0 < x && x < 10).
Der ternäre Operator
Wenn du nur zwischen zwei Werten wählen willst, ist der ternäre Operator ?: ein kompakter Einzeiler. Lies condition ? a : b als „wenn Bedingung dann a sonst b“:
Der ternäre Operator liefert einen Wert, den du zuweisen, übergeben oder direkt ausgeben kannst - etwas, das ein einfaches if nicht kann. Behalte ihn für einfache Auswahl: Wenn einer der Zweige mehrere Anweisungen oder echte Logik braucht, bleibt ein vollständiges if-else lesbar, wo ein verschachtelter ternärer Operator schnell zum Rätsel wird. (Eine Feinheit: Beide Zweige müssen einen gemeinsamen Typ haben, also mische nicht etwa einen string und einen int.)
if mit einem Initialisierer (C++17)
Seit C++17 kannst du eine Variable direkt im if deklarieren, deren Gültigkeitsbereich auf das if/else beschränkt ist. Das verhindert, dass kurzlebige Hilfsvariablen in den umgebenden Code überlaufen:
Der Teil vor dem ; läuft einmal, und sein Ergebnis ist sowohl in der Bedingung als auch im else sichtbar. Das ist großartig für Muster nach dem Schema „etwas berechnen, dann darauf verzweigen“ - und weil die Umwandlung des Ergebnisses einmal im Voraus geschieht, vermeidest du, später neu zu berechnen oder versehentlich einen veralteten Wert wiederzuverwenden. Greife danach, wann immer ein temporärer Wert nur für den Zweig benötigt wird.
Eine Stolperfalle: die Falle der hängenden Klammer
C++ erlaubt es dir, die geschweiften Klammern wegzulassen, wenn ein Zweig eine einzige Anweisung hat, aber das lädt zu einem subtilen Fehler ein - die Einrückung lügt:
if (loggedIn)
cout << "Welcome\n";
cout << "Loading dashboard\n"; // gehört NICHT zum if!
Nur die erste Zeile wird vom if gesteuert; die zweite läuft immer, unabhängig von loggedIn, obwohl die Einrückung etwas anderes nahelegt. Ein verwandter Klassiker ist das verirrte Semikolon: if (x > 0); beendet das if mit einem leeren Körper, sodass der folgende Block bedingungslos läuft. Verwende immer geschweifte Klammern - selbst für eine einzige Zeile - und der Großteil dieser Fehlerklasse verschwindet.
Als Nächstes: switch
if-else if-Ketten sind perfekt, wenn jeder Zweig eine andere Bedingung testet. Aber wenn du einen einzigen Wert gegen viele feste Möglichkeiten prüfst - eine Menüauswahl, ein Enum, einen Statuscode - wird eine lange else if-Leiter repetitiv und ist leicht in der falschen Reihenfolge anzuordnen. Die switch-Anweisung ist genau dafür gebaut, und darum geht es auf der nächsten Seite.
Häufig gestellte Fragen
Wie schreibt man eine if-else-Anweisung in C++?
Setze eine Bedingung in Klammern hinter if, den auszuführenden Code in geschweifte Klammern und einen optionalen else-Block für den Fall, dass die Bedingung falsch ist: if (score >= 60) { cout << "Pass"; } else { cout << "Fail"; }. Die Bedingung wird in bool umgewandelt, also gilt jede Zahl ungleich null als wahr und 0 als falsch.
Was ist der Unterschied zwischen = und == in einer C++ if-Anweisung?
== vergleicht zwei Werte auf Gleichheit, während ein einzelnes = zuweist. if (x = 5) zu schreiben weist x den Wert 5 zu und testet dann 5 (immer wahr) - ein klassischer Fehler. Es kompiliert nur mit einer Warnung, also schalte Warnungen ein und erwäge, die Konstante zuerst zu schreiben: if (5 == x).
Was ist der ternäre Operator in C++?
Der ternäre Operator condition ? valueIfTrue : valueIfFalse ist ein kompaktes if-else, das einen Wert liefert. Zum Beispiel wählt string label = age >= 18 ? "adult" : "minor"; einen von zwei Werten. Verwende ihn für einfache Wertauswahl; greife zu einem vollständigen if-else, wenn jeder Zweig echte Logik enthält.