Kapitel drei - Bedingungen und Vergleiche

Verzweigungen und Schleifen: Steuern des Ablaufs Ihres C-Programms

Eine der Grundlagen jeder Programmiersprache ist die Fähigkeit, bedingte Operationen durchzuführen - um den Programmfluss abhängig vom Testergebnis zu ändern - und C ermöglicht es Ihnen, dies zu tun. In diesem Kapitel erfahren Sie, wie Sie die Bedingungen in Ihren C-Programmen testen und wie Sie anhand der Ergebnisse bestimmen, was als Nächstes geschieht. In C ist der Mechanismus zum Steuern des Flusses basierend auf dem Testen einer Bedingung die if-else-Anweisung. Hier ist ein einfaches Beispiel:

#include <stdio.h> void main (void) { int a = 0; if (a == 0) { printf ("a ist gleich mit 0\n"); } else { printf ("a ist nicht gleich mit 0\n"); } }

Oben: Eine einfache if-then Struktur in C, mit einer Entscheidung auf dem Wert von a. Stellen Sie außerdem sicher, dass Sie in den Klammern nach dem if ein doppeltes Gleichheitszeichen (==) verwenden, nicht ein einzelnes!

[GESCHWEIFTE KLAMMERN] Geschweifte Klammern werden verwendet, um eine Reihe von Anweisungen zu gruppieren, die immer zusammen ausgeführt werden. Wenn Ihre Schleife oder if-Anweisung nur eine einzige Anweisung ausführen muss, können Sie die geschweiften Klammern nach dem Test weglassen, aber dies kann den Zweck des Codes für einen Menschen weniger offensichtlich machen!

Hier folgt auf das Schlüsselwort if ein Test in runden Klammern, in diesem Fall a == 0. Wenn der Test als wahr ausgewertet wird, werden die Operationen ausgeführt, die nach dem Test in geschweiften Klammern stehen. Dieses Beispiel zeigt auch die Verwendung einer else-Klausel. Am Ende der geschweiften Klammern um die Operationen, die Sie ausführen möchten, wenn der Test wahr (true) ist, folgt ein anderes, gefolgt von einem weiteren Satz geschweifter Klammern. Diese enthalten die Operationen, die Sie ausführen möchten, wenn der ursprüngliche Test als falsch (false) bewertet wurde.

Versuchen Sie, den obigen Code zu kompilieren, und ändern Sie den Wert, mit dem a initialisiert wird, um sicherzustellen, dass es das tut, was Sie erwarten.

= oder ==

Soweit alles gut, aber worum geht es bei einer == 0? Wenn wir wissen wollen, ob a gleich 0 ist, setzen wir einfach a = 0. Warum sind die beiden Gleichheitszeichen? Versuchen Sie, das doppelte Gleichheitszeichen durch ein einzelnes Gleichheitszeichen zu ersetzen, und sehen Sie, was passiert.

Dies ist ein sehr wichtiger Aspekt der C-Syntax und eine häufige Fehlerquelle. Das Gleichheitszeichen wird für zwei verschiedene Zwecke verwendet: Zum einen soll einer Variablen ein Wert zugewiesen werden, zum anderen soll geprüft werden, ob eine Variable einem Wert entspricht. Ein einzelnes Gleichheitszeichen = weist eine Variable zu; Ein doppeltes Gleichheitszeichen == testet eine Variable.

Die Angabe …

if (a == 0)

… testet, ob a gleich 0 ist. Wenn dies der Fall ist, wird der Test als wahr ausgewertet und der Code unmittelbar nach der Ausführung des if ausgeführt.

Aber die Aussage …

if (a = 0)

… vergleicht a nicht mit 0: Es setzt nur a auf 0. Wie entscheidet der Compiler also, was als nächstes zu tun ist? In diesem Fall wird nur der Wert der Klammern angezeigt. Sie haben a auf 0 gesetzt, daher ist der Wert in den Klammern 0.

In C entspricht ein Wert von 0 false, und ein Wert ungleich Null entspricht true. Wenn Sie also die Doppelgleichheit durch eine Einzelgleichheit ersetzen, haben Sie den Wert von a geändert und prüfen dann, ob der Wert, auf den Sie a gesetzt haben, true oder false entspricht. Beides ist nicht das, was Sie tun sollten! Wenn sich ein C-Programm seltsam verhält, überprüfen Sie sorgfältig, ob alle Ihre Tests tatsächlich Tests und keine Zuweisungen sind. Dies ist ein sehr einfacher Fehler.

Also == ist der Test, um festzustellen, ob ein Wert einem anderen entspricht. Es gibt andere nützliche Symbole, die in einem Test verwendet werden können. Das Symbol != Bedeutet beispielsweise „ist nicht gleich“. Die mathematischen Operatoren > und < werden verwendet, um zu testen, ob 'größer als' bzw. 'kleiner als' ist, und sie können auch mit einem Gleichheitszeichen kombiniert werden, um >= und <= zu ergeben. Die Tests für 'ist größer als oder gleich' und 'ist kleiner oder gleich'.

Sie können Tests mit logischen Operatoren kombinieren. Das Symbol && ist ein boolesches AND (d.h. Testet, ob beide Seiten wahr sind) und || ist ein boolesches OR (d.h. Testet, ob eine der Seiten wahr ist). Um Code nur auszuführen, wenn sowohl a als auch b 0 sind, würden Sie if (a == 0 && b == 0) verwenden. Um zu überprüfen, ob a oder b 0 ist, verwenden Sie if (a == 0 || b == 0).

Ebenso können Sie den Operator ! als Booleschen Wert NOT verwenden, um das Ergebnis eines Tests zu invertieren. Damit ist if(!(a == 0)) dasselbe wie if(a! = 0).

Schleifen

Die if-Anweisung ist nützlich, um eine einzelne Entscheidung zu treffen. Was ist jedoch, wenn Sie wiederholt etwas tun möchten, bis ein Test wahr oder falsch ist? Wir verwenden hierfür eine while-Schleife. Hier ein Beispiel:

#include <stdio.h> void main (void) { int a = 0; while (a < 5) { printf ("a ist gleich mit %d\n", a); a++; } printf ("a ist gleich mit %d und ich bin fertig \n", a); }
[UNENDLICHE SCHLEIFEN] Stellen Sie sicher, dass Ihre Schleifen immer fertig sind! Wenn die Bedingung, die Sie in einer while-Schleife testen, niemals als falsch ausgewertet wird, bleibt Ihr Programm für immer in der Schleife und wird niemals beendet. Wenn ein Programm beim Ausführen scheinbar nichts tut, überprüfen Sie Ihre Schleifentests.

Dies ist einer if-Anweisung sehr ähnlich, aber der Code in den geschweiften Klammern wird wiederholt ausgeführt, solange der Test in den runden Klammern wahr ist, nicht nur einmal.

In unserem Beispielcode wird a also auf 0 initialisiert. Wir geben die while-Schleife ein und testen, ob a kleiner als 5 ist, was es ist, sodass der Code in den geschweiften Klammern ausgeführt wird. Der Wert von a wird ausgedruckt, dann haben wir eine der nützlichen Verknüpfungen von C, um zu viel Eingabe zu sparen …

a++ ist dasselbe wie a = a + 1. Das doppelte Plus bedeutet „addiere 1 zu dieser Variablen“. In ähnlicher Weise bedeutet a– „von dieser Variablen 1 subtrahieren“. Das wird sehr häufig verwendet, um die Schritte in einer Schleife zu zählen. Die Notation a+ = 1 kann auch verwendet werden, um einer Variablen einen Wert hinzuzufügen. Dies funktioniert auch für andere arithmetische Operatoren, also multipliziert a* = 3 a mit 3 und so weiter.

In der while-Schleife wird der Test in den runden Klammern jedes Mal wiederholt, wenn der Code in den geschweiften Klammern ausgeführt wurde. Wenn dies immer noch zutrifft, wird der Schleifencode erneut wiederholt. Sobald der Test falsch ist, wird die Ausführung mit der Zeile nach der schließenden geschweiften Klammer fortgesetzt. Manchmal möchten wir vielleicht eine Schleife, die immer mindestens einmal ausgeführt wird, bevor ein Test durchgeführt wird. Wir tun dies mit einer kleinen Änderung der Syntax, um eine do-while-Schleife zu erstellen:

#include <stdio.h> void main (void) { int a = 0; do { printf ("a ist gleich mit %d\n", a); a++; } while (a < 5); printf ("a ist gleich mit %d und ich bin fertig \n", a); }

Das Schlüsselwort do steht jetzt vor der geschweiften Klammer, und while und test nach der schließenden geschweiften Klammer. Wenn dies ausgeführt wird, wird der Code in der Schleife vor dem Test immer einmal ausgeführt. Sie können dies testen, indem Sie beide obigen Schleifenbeispiele mit einer Initialisierung auf 5 anstelle von 0 ausführen und sehen, wie sich das Verhalten unterscheidet.

$ ./myprog
a ist gleich mit 0
a ist gleich mit 1
a ist gleich mit 2
a ist gleich mit 3
a ist gleich mit 4
a ist gleich mit 5 und ich bin fertig
$

Oben: Eine Schleife führt denselben Code so lange aus, bis der Schleifentest falsch ist!

[MEHR ÜBER SEMIKOLONS (;)] Im Gegensatz zum Test in einer if-Anweisung oder einer while-Schleife müssen Sie nach dem Test ein Semikolon in eine do-while-Schleife einfügen. Dies zeigt das Ende des Schleifencodes an. In einer while-Schleife endet der Schleifencode erst mit der letzten Anweisung in den geschweiften Klammern.

Im nächsten Kapitel werden wir uns einige komplexere Beispiele für Schleifen und Flusskontrolle ansehen.