Kontrollfluss in C verstehen: Boolesche Logik und Bedingungen

4

C führt Code nicht nur linear aus. Es trifft Entscheidungen. Im Mittelpunkt jeder Entscheidung, die ein C-Programm trifft, steht der boolesche Ausdruck. Unabhängig davon, ob Sie eine „if“-Anweisung oder eine „while“-Schleife verwenden, läuft die Logik auf eines hinaus: Ist diese Bedingung wahr oder falsch?

Schauen wir uns ein einfaches Beispiel an.

„c

int main() {
int b;
printf(“Geben Sie einen Wert ein:”);
scanf(“%d”, &b);
wenn (b < 0) printf("Der Wert ist negativ\n"); 0 zurückgeben; } „

Hier bittet das Programm um Eingaben. Diese Zahl wird in der Variablen „b“ gespeichert. Dann prüft es eine Bedingung. Der fragliche Boolesche Ausdruck ist „(b < 0)“. C wertet dies aus. Wenn das Ergebnis wahr ist, gibt das Programm „Der Wert ist negativ“ aus. Wenn es falsch ist, unternimmt das Programm nichts. Es bleibt still.

Die Regel ist einfach. Wenn der Ausdruck True ergibt, führt C die einzelne Zeile aus, die unmittelbar auf das „if“ folgt. Wenn Sie die geschweiften Klammern „{}“ verwenden, wird der gesamte darin enthaltene Block ausgeführt. Wenn der Ausdruck False ist, überspringt C diese Zeile oder diesen Block vollständig.

Aber Programme befassen sich selten nur mit einem einzigen Ergebnis. Oft müssen Sie auch mit Nullen oder positiven Zahlen umgehen.

„c

int main() {
int b;
printf(“Geben Sie einen Wert ein:”);
scanf(“%d”, &b);
wenn (b < 0) printf("Der Wert ist negativ\n"); sonst wenn (b == 0) printf("Der Wert ist Null\n"); sonst printf("Der Wert ist positiv\n"); 0 zurückgeben; } „

Diese Struktur verwendet „else if“ und „else“, um die übrigen Fälle abzudecken. Als nächstes wird auf Null geprüft. Wenn dies fehlschlägt, wird davon ausgegangen, dass der Wert positiv ist.

Manchmal werden Entscheidungen kompliziert. Möglicherweise müssen Sie mehrere Bedingungen gleichzeitig überprüfen.

„c
if ((x==y) && (j>k))
z=1;
sonst
q=10;

Diese Aussage liest sich wie natürliche Sprache. Wenn „x“ gleich „y“ UND „j“ größer als „k“ ist, dann setzen Sie „z“ auf 1. Andernfalls setzen Sie „q“ auf 10. Sie werden diese Art von Anweisungen während Ihrer gesamten C-Karriere verwenden. Die meisten Entscheidungen werden einfach sein. Gelegentlich werden sie komplex.

Achten Sie besonders auf die Syntax. Eine häufige Gefahr für Anfänger besteht darin, Aufgaben mit Vergleichen zu verwechseln.

C verwendet ==, um auf Gleichheit zu testen.
C verwendet =, um einer Variablen einen Wert zuzuweisen.

Werden sie verwechselt, entstehen Fehler, die schwer zu finden sind. Man legt einen Wert fest. Der andere prüft eine Bedingung. Sie sind nicht austauschbar.

C verlässt sich auch auf bestimmte Operatoren für logische Operationen. Das Symbol && stellt eine boolesche UND-Operation dar. Es stellt sicher, dass beide Seiten der Bedingung wahr sein müssen.

Hier ist eine Kurzreferenz für alle Booleschen Operatoren in C:

  • == : Gleichheit
  • != : Ungleichheit
  • < : weniger als
  • > : größer als
  • <= : kleiner oder gleich
  • >= : größer als

Schleifenlogik in C: while, do-while und for

Die Verwendung einer while -Schleife ist unkompliziert. Es spiegelt die Einfachheit einer standardmäßigen if-Anweisung wider. Betrachten Sie diesen Ausschnitt:

while (a < b) { printf("%d\n", a); a = a + 1; }

Diese Struktur führt die beiden Zeilen innerhalb der geschweiften Klammern wiederholt aus. Es stoppt nur, wenn a größer oder gleich b ist. Die Logik ist linear. Zustand prüfen. Körper ausführen. Wiederholen.

C bietet auch ein do-while -Konstrukt an. Im Gegensatz zur Standard-while-Schleife prüft diese die Bedingung nach der ersten Ausführung. Dies garantiert, dass der Codeblock mindestens einmal ausgeführt wird.

„c

int main() {
int a;
printf(“Geben Sie eine Zahl ein:”);
scanf(“%d”, &a);
wenn (a) {
printf(“Der Wert ist wahr\n”);
}
0 zurückgeben;
}

Hinweis: Das obige Beispiel verwendet eine if-Anweisung innerhalb der Funktion. Eine echte Do-while würde den Körper einwickeln und am Ende den Zustand überprüfen.

Die for-Schleife als Abkürzung

Die for-Schleife ist im Wesentlichen eine komprimierte while -Anweisung. Es bündelt Initialisierung, Test und Inkrementierung in einer Zeile.

Schauen Sie sich diese Standard-While-Schleife an:

x=1;
while (x<10) { bla bla bla x++; // x++ ist identisch mit x=x+1 }

Sie können dies als for-Schleife umschreiben:

for(x=1; x<10; x++) { bla bla bla }

Die Komponenten sind klar. x=1 wird initialisiert. x<10 Tests. x++ Inkremente. Die for-Schleife komprimiert sie nur. Sie sind nicht auf einfache Variablen beschränkt. Sie können komplexe Logik in diese Slots packen.

Nehmen Sie dieses Beispiel:

a=1;
b=6;
while (a < b) { a++; printf("%d\n",a); }

It becomes:

for (a=1,b=6; a < b; a++,printf("%d\n",a));

Es funktioniert. Es ist auch verwirrend. Der Kommaoperator ermöglicht mehrere Anweisungen in den Abschnitten Initialisierung und Inkrementierung. Im Testteil funktioniert es nicht. Viele C-Entwickler lieben diese Kompaktheit. Andere finden es unlesbar. Sie brechen es auf. Beide Ansätze sind gültig. Wählen Sie basierend darauf aus, wer den Code später pflegen wird.

Die Gefahr von = vs. == in C

Der == -Operator verursacht Kopfschmerzen. Entwickler geben in booleschen Ausdrücken häufig versehentlich ein einzelnes = ein. Der Compiler akzeptiert beides. Das Verhalten ist sehr unterschiedlich.

In C werden boolesche Ausdrücke zu ganzen Zahlen ausgewertet. Zero is False. Jede Ganzzahl ungleich Null ist True. Dies bedeutet, dass jede Ganzzahl in einem booleschen Kontext existieren kann.

Betrachten Sie diesen legalen C-Code:

if (a) { printf(“Nicht-Null”); }

Wenn a etwas anderes als 0 ist, wird der Block ausgeführt.

Schauen Sie sich nun if (a=b) an. Dabei werden keine Werte verglichen. Es weist a b zu und testet dann den neuen Wert von a. Wenn b 0 ist, ist die Bedingung falsch. Wenn b etwas anderes ist, ist es wahr. Die Variable a ändert sich. Dies ist wahrscheinlich nicht das, was Sie beabsichtigt haben. Zum Vergleich meinten Sie wahrscheinlich ==.

Diese Funktion ist nicht nutzlos. It has valid use cases. Aber es ist eine Falle. Seien Sie vorsichtig mit der Verwendung von = und ==. Ein Zeichen ändert die Logik vom Vergleich zur Zuweisung.