In der Programmiersprache C gibt es drei Hauptschleifen: for, while und do-while. Ihr Auftreten steht im Zusammenhang mit der Notwendigkeit, wiederholende Berechnungen durchzuführen, den Zugriff auf Datenstrukturen zu erleichtern und die Verarbeitung von Arrays zu automatisieren. Der Syntax der Schleifen erschien erstmals in frühen Programmiersprachen (Algol, Fortran) und wurde an die Syntax von C angepasst, um die Lesbarkeit und den Steuerungsfluss zu verbessern.
Historie der Frage
Ursprünglich verwendeten Programmierer Labels und goto, um wiederholende Aktionen zu organisieren, was schnell zu verwirrendem Code (spaghetti code) führte. Die Einführung von strukturierten Schleifen (in C — seit 1972) ermöglichte es, den Ansatz zur Wiederholung und zum beschreiben der Logik von Programmen zu vereinheitlichen.
Problem
Die Hauptaufgabe von Schleifen besteht darin, festzustellen, wie oft eine bestimmte Aktion wiederholt werden soll, und wie man den Ausgang aus der Schleife kontrolliert. Es ist wichtig, den Schleiypentyp korrekt auszuwählen, je nachdem, ob die Anzahl der Wiederholungen im Voraus bekannt ist, ob der Rumpf mindestens einmal ausgeführt werden muss und ob die Austrittsbedingung im Voraus berechnet werden muss.
Lösung
Beispielcode:
#include <stdio.h> int main() { int i = 0; // Beispiel für eine while-Schleife while (i < 3) { printf("while: %d\n", i); i++; } // Beispiel für eine for-Schleife for (int j = 0; j < 3; j++) { printf("for: %d\n", j); } // Beispiel für eine do-while-Schleife int k = 0; do { printf("do-while: %d\n", k); k++; } while (k < 3); return 0; }
Schlüsselmerkmale:
Was ist der Unterschied zwischen while(1) und for(;;) und welche sollte man für eine endlose Schleife verwenden?
Antwort: Beide Varianten erzeugen eine endlose Schleife und werden in denselben Maschinencode übersetzt, es gibt keinen Leistungsunterschied. Normalerweise wird for(;;) verwendet, um klar zu zeigen, dass keine Initialisierung, kein Austrittsbedingung und kein Schritt erwartet wird.
for(;;) { // endlose Schleife } // oder while(1) { // endlose Schleife }
Kann man die Zählervariable innerhalb des Körpers von for ändern und was passiert?
Antwort: Das Ändern der Zählervariable (zum Beispiel i++) im Körper der for-Schleife führt zu einer unvorhersehbaren Anzahl von Iterationen. Solche Änderungen verwirren die Leser und erschweren das Debugging.
for (int i = 0; i < 10; i++) { printf("%d\n", i); i += 2; // nicht standardmäßige Schrittänderung! }
Was passiert, wenn der Körper der Schleife leer bleibt? In welchen Fällen ist dies sinnvoll?
Antwort: Ein leerer Schleifenrumpf ist zulässig und wird verwendet, um auf das Eintreten eines Ereignisses zu warten oder Daten vorzubereiten:
while(*src++ = *dst++); // Kopieren einer Zeichenkette bis zum Zeichen '\0'
Negativer Fall
In einem Projekt wurde for mit der Änderung der Zählervariablen im Körper verwendet, was zu einer falschen Anzahl verarbeiteter Elemente, Bugs und Schwierigkeiten beim Debuggen führte.
Vorteile:
Nachteile:
Positiver Fall
Verwendung von for zur Durchlauf eines Arrays fester Länge, ohne den Zähler von außen zu ändern:
Vorteile:
Nachteile: