Nel linguaggio C ci sono tre principali strutture cicliche: for, while e do-while. La loro esistenza è legata alla necessità di realizzare calcoli ripetitivi, facilitare l'iterazione su strutture dati e automatizzare la gestione degli array. Per la prima volta, la sintassi dei cicli è apparsa nei primi linguaggi di programmazione (Algol, Fortran) ed è stata adattata alla sintassi C per migliorare la leggibilità e il controllo del flusso.
Storia della questione
Inizialmente, i programmatori usavano etichette e goto per organizzare azioni ripetitive, il che portava rapidamente a un codice confuso (spaghetti code). L'introduzione dei cicli strutturati (in C - dal 1972) ha consentito di unificare l'approccio alla ripetizione e alla descrizione della logica dei programmi.
Problema
Il compito principale dei cicli è determinare quante volte deve ripetersi una determinata azione e come controllare l'uscita dal ciclo. È importante scegliere correttamente il tipo di ciclo in base al fatto che il numero di ripetizioni sia già noto, se è necessario eseguire il corpo almeno una volta e se è necessario calcolare in anticipo la condizione di uscita.
Soluzione
Esempio di codice:
#include <stdio.h> int main() { int i = 0; // Esempio di ciclo while while (i < 3) { printf("while: %d\n", i); i++; } // Esempio di ciclo for for (int j = 0; j < 3; j++) { printf("for: %d\n", j); } // Esempio di ciclo do-while int k = 0; do { printf("do-while: %d\n", k); k++; } while (k < 3); return 0; }
Caratteristiche chiave:
Qual è la differenza tra while(1) e for(;;) e quale dei due è meglio utilizzare per un ciclo infinito?
Risposta: Entrambe le varianti creano un ciclo infinito e vengono tradotte in codice macchina identico, non c'è differenza nelle prestazioni. Di solito si utilizza for(;;) per mostrare chiaramente che non ci si aspetta inizializzazione, condizione di uscita o passo.
for(;;) { // ciclo infinito } // o while(1) { // ciclo infinito }
Può essere cambiata la variabile di ciclo all'interno del corpo del for e cosa succederà?
Risposta: Cambiare la variabile contatore (ad esempio, i++) all'interno del corpo del ciclo for porterà a un numero imprevedibile di iterazioni. Tali modifiche possono confondere i lettori e rendere difficile il debug.
for (int i = 0; i < 10; i++) { printf("%d\n", i); i += 2; // modifica non standard del passo! }
Cosa succede se si lascia il corpo del ciclo vuoto? In quali casi è significativo?
Risposta: Un corpo del ciclo vuoto è consentito ed è usato per attendere l'arrivo di un evento o preparare dati:
while(*src++ = *dst++); // copia della stringa fino al carattere '\0'
Caso negativo
Nel progetto è stato utilizzato for con modifica della variabile contatore all'interno del corpo, il che ha portato a un numero errato di elementi elaborati, bug e difficoltà nel debug.
Pro:
Contro:
Caso positivo
Uso di for per iterare su un array di lunghezza fissa senza modificare il contatore dall'esterno:
Pro:
Contro: