In de C-taal zijn er drie hoofdlusconstructies: for, while en do-while. Hun ontstaan was gerelateerd aan de noodzaak om herhalende berekeningen uit te voeren, het vergemakkelijken van de doorloop van datastructuren en het automatiseren van de verwerking van tabellen. Voor het eerst verscheen de syntaxis voor lussen in vroege programmeertalen (Algol, Fortran) en werd deze aangepast aan de syntaxis van C om de leesbaarheid en controle van de stroom te verbeteren.
Geschiedenis van de kwestie
Aanvankelijk gebruikten programmeurs labels en goto om herhalende acties te organiseren, wat snel leidde tot verwarde code (spaghetti code). De invoering van structurele lussen (in C – sinds 1972) maakte het mogelijk om een uniforme aanpak voor herhaling en de beschrijving van de logica van programma's te creëren.
Probleem
De belangrijkste taak van lussen is het bepalen van het aantal keren dat een bepaalde actie herhaald moet worden en hoe de uitgang uit de lus gecontroleerd moet worden. Het is belangrijk om het type lus correct te kiezen, afhankelijk van of het aantal herhalingen van tevoren bekend is, of het lichaam minstens één keer uitgevoerd moet worden en of de uitgangsvoorwaarde van tevoren moet worden berekend.
Oplossing
Voorbeeldcode:
#include <stdio.h> int main() { int i = 0; // Voorbeeld van een while-lus while (i < 3) { printf("while: %d\n", i); i++; } // Voorbeeld van een for-lus for (int j = 0; j < 3; j++) { printf("for: %d\n", j); } // Voorbeeld van een do-while-lus int k = 0; do { printf("do-while: %d\n", k); k++; } while (k < 3); return 0; }
Belangrijke kenmerken:
Wat is het verschil tussen while(1) en for(;;) en welke is beter voor een oneindige lus?
Antwoord: Beide opties creëren een oneindige lus en worden in dezelfde machinecode vertaald, er is geen verschil in prestaties. Meestal wordt for(;;) gebruikt, om duidelijk te maken dat er geen initiatie, uitgangsvoorwaarde of stap wordt verwacht.
for(;;) { // oneindige lus } // of while(1) { // oneindige lus }
Kan de lusvariabele binnen het lichaam van de for-lus worden gewijzigd en wat gebeurt er dan?
Antwoord: Het wijzigen van de teller variabele (bijvoorbeeld, i++) binnen het lichaam van de for-lus zal leiden tot een onvoorspelbaar aantal iteraties. Dergelijke wijzigingen kunnen verwarring veroorzaken bij lezers en debuggen bemoeilijken.
for (int i = 0; i < 10; i++) { printf("%d\n", i); i += 2; // ongewone wijziging van de stap! }
Wat gebeurt er als het lichaam van de lus leeg is? In welke gevallen is dat zinvol?
Antwoord: Een leeg lichaam van de lus is toegestaan en wordt gebruikt voor het wachten op een gebeurtenis of het voorbereiden van gegevens:
while(*src++ = *dst++); // kopiëren van een string tot het karakter '\0'
Negatieve case
In een project werd for gebruikt met wijziging van de teller variabele binnen het lichaam, wat leidde tot een onjuist aantal verwerkte elementen, bugs en moeilijkheden bij het debuggen.
Voordelen:
Nadelen:
Positieve case
Gebruik van for voor het doorlopen van een tabel van vaste lengte zonder de teller van buiten te wijzigen:
Voordelen:
Nadelen: