Barninga Z
a- a+

Il flusso elaborativo: for

for

Tra le istruzioni C di controllo dei ciclo, la forè sicuramente la più versatile ed efficiente.La for è presente in tutti (o quasi) ilinguaggi, ma in nessuno ha la potenza di cui dispone in C.Infatti, in generale, i cicli di tipo while ederivati sono utilizzati nelle situazioni in cui non èpossibile conoscere a priori il numero esatto di iterazioni,mentre la for, grazie alla sua logica "puntodi partenza; limite; passo d'incremento" , sipresta proprio ai casi in cui si può determinare inpartenza il numero di cicli da compiere. 

Nella for del C è ancora valida la logica atre coordinate, ma, a differenza della quasi totalitàdei linguaggi di programmazione, esse sono reciprocamentesvincolate e non necessarie. Ciò significa che, se inBasic[5] la for agisce su un'unica variabile,che viene inizializzata e incrementata (o decrementata) sinoal raggiungimento di un limite prestabilito, in C essapuò manipolare, ad esempio, tre diverse variabili (omeglio, tre espressioni di diverso tipo); inoltre nessunadelle tre espressioni deve necessariamente esserespecificata: è perfettamente lecita una forpriva di condizioni di iterazione. 

A questo punto, tanto vale esaurire le banalitàformali, per concentrarsi poi sulle possibili modalitàdi definizione delle tre condizioni che pilotano il ciclo.Sia subito detto, dunque, che anche la for vuole chele condizioni siano specificate tra parentesi tonde e che seil blocco di codice del ciclo comprende più di unaistruzione sono necessarie le solite graffe, aperta e chiusa.Anche nei cicli for possiamo utilizzare leistruzioni break e continue: la prima per"saltar fuori" dal ciclo; la seconda per tornare"a bomba" alla valutazione del test. Anche i ciclifor possono essere annidati, e va tenuto presenteche il ciclo più interno compie una serie completa diiterazioni ad ogni iterazione di quello che immediatamente locontiene. 

E vediamo, finalmente, qualche ciclo for dal vivo:nella sua forma banale, quasi "Basic­istica" ,può assumere il seguente aspetto: 

for(i = 1; i < k; i++) {  ....    }

Nulla di particolare. Prima di effettuare la primaiterazione, la variabile i è inizializzata a1. Se essa risulta minore della variabile kil ciclo è eseguito una prima volta. Al termine diogni iterazione essa è incrementata e successivamenteconfrontata con la k; se risulta minore diquest'ultima il ciclo è ripetuto. 

Vale la pena di evidenziare che le tre coordinate logichestanno tutte quante all'interno delle parentesi tonde esono separate tra loro dal punto e virgola(";"); solo la sequenza (;;) deveobbligatoriamente essere presente in un ciclofor

In effetti possiamo avere una for come laseguente: 

for( ; ; ) {  ....    }

Qual è il suo significato? Nulla èinizializzato. Non viene effettuato alcun test. Non vienemodificato nulla. Il segreto consiste nel fatto chel'assenza di test equivale a condizione sempreverificata: la for dell'esempio definisce quindiun'iterazione infinita. Il programma rimane intrappolatonel ciclo finché si verifica una condizione che gliconsenta di abbandonarlo in altro modo, ad esempio conl'aiuto di una break

Ma si può fare di meglio... 

for(i = 0; string[i]; )  ++i;

Il ciclo dell'esempio calcola la lunghezza della stringa(terminatore nullo escluso). Infatti i èinizializzata a 0 e viene valutato se il caratteread offset 0 in string è nullo; se non loè viene eseguita l'unica istruzione del ciclo, checonsiste nell'incrementare i. A questo puntoè valutato se è nullo il byte ad offset1 in string, e così iterando finchéstring[i] non è proprio il NULLfinale. L'esempio appena presentato è del tuttoequivalente a 

for(i = 0; string[i]; i++);

Il punto e virgola che segue la parentesi tonda indica chenon vi sono istruzioni nel ciclo. Le sole cose da fare sono,perciò, la valutazione della condizione el'incremento di i finché, come nel casoprecedente, string[i] non punta al NULL chechiude la stringa. Se poi volessimo includere nel calcoloanche il NULL, ecco come fare: 

for(i = 0; string[i++]; );

Sissignori, tutto qui. Anche questo ciclo non contiene alcunaistruzione; tuttavia, in questo caso, l'incremento dii fa parte della condizione e (trattandosi di unpostincremento) viene effettuato dopo la valutazione, quindianche (per l'ultima volta) quando string[i]punta al NULL. E che dire della prossima? 

for( ; *string++; ) {  ....    }

Nulla di particolare, in fondo: viene verificato se*string è un byte non nullo e stringè incrementato. Se la verifica dà esitopositivo viene eseguito il codice del ciclo. Viene poinuovamente effettuata la verifica, seguita a ruotadall'incremento, e così via. Quanti si sonoaccorti che questo ciclo for è assolutamenteequivalente a un ciclo while? Eccolo: 

while(*string++) {  ....    }

In effetti si potrebbe dire che l'istruzionewhile, in C, è assolutamente inutile, inquanto può essere sempre sostituita dallafor, la quale, anzi, consente generalmente diottenere una codifica più compatta ed efficientedell'algoritmo. La maggiore compattezza deriva dallapossibilità di utilizzare contestualmente allacondizione, se necessario, anche un'istruzione diinizializzazione ed una di variazione. La maggiore efficienzainvece dipende dal comportamento tecnico del compilatore, ilquale, se possibile, gestisce automaticamente i contatori deicicli for come variabili register

Gli esempi potrebbero continuare all'infinito, ma quellipresentati dovrebbero essere sufficienti per evidenziare,almeno a grandi linee, le caratteristiche salienti dei ciclidefiniti mediante l'istruzione for. E' forseil caso di sottolineare ancora una volta che il contenutodelle parentesi tonde dipende fortemente dal ciclo che sivuole eseguire e dall'assetto elaborativo che gli sivuole dare, ma l'uso dei due punto e virgola èobbligatorio. Il primo e l'ultimo parametro non devonoessere necessariamente inizializzare ed incrementare (odecrementare) il contatore (o il medesimo contatore),così come il parametro intermedio non deve per forzaessere una condizione da valutare. Ciascuno di questiparametri può essere una qualunque istruzione C opuò venire omesso. Il compilatore, però,interpreta sempre il parametro di mezzo come una condizioneda verificare, indipendentemente da ciò che èin realtà: detto parametro è quindi semprevalutato come vero o falso[6], e da esso dipendonol'ingresso nel ciclo e le successive iterazioni.

 



Ti potrebbe interessare anche

commenta la notizia