Nello: "non ho capito perché il ciclo for ha 4 argomenti"
Un ciclo for prevede tre elementi:
- inizializzazione preliminare
- controllo condizionale prima di ogni ciclo
- operazioni da eseguire in chiusura di ogni ciclo
I tre elementi sono separati tra loro dal classico punto e virgola.
Tutti e tre gli elementi possono contenere istruzioni multiple, separate da virgola, che vengono eseguite in sequenza, nello stesso ordine in cui compaiono nel codice.
Ho provato a metter giù un esempio, sperando risultasse chiaro, invece avendo dovuto inserire un sacco di cose non lo è come credevo.
#include <stdio.h>
#include <stdlib.h>
#define V "vero"
#define F "falso, interrompi il ciclo"
int main() {
int val, lim, inc, i;
for(
// inizializzazione, in questo caso 4 istruzioni per 4 variabili,
// piu' una istruzione printf() per vedere cosa sta succedendo
val=37, lim=50, inc=10, i=0,
printf("INIZIALIZZAZIONE\n val = %d\n lim = %d\n inc = %d\n i = %d\n\n",val,lim,inc,i);
// nota le virgole e il punto e virgola
// controllo condizionale prima di ogni ciclo
0<printf("CONTROLLO CONDIZIONALE prima del ciclo #%d\n printf() riuscita\n val<=lim: %s\n i<5: %s\n",i+1,val<=lim?V:F,i<5?V:F) && val<=lim && i<5;
// il printf() iniziale e' chiaramente un'idiozia, pero' viene controllato
// anche il suo valore di ritorno, che e' negativo in caso di errore;
// il ciclo continua a meno che si verifichi una qualsiasi di queste condizioni...
// 1: printf() genera un errore
// 2: val risulta essere maggiore del limite preimpostato
// 3: sta per iniziare un sesto ciclo, non voluto
// operazioni da eseguire in chiusura di ogni ciclo
i++, printf("OPERAZIONI IN CHIUSURA DEL CICLO #%d\n i incrementato a %d\n\n",i,i)
// qui il punto e virgola non ci va perche' e' l'ultimo dei tre elementi
// nota comunque la virgola dopo i++
) // fine del codice dell'istruzione for
{
// blocco con le istruzioni da eseguire se le precedenti
// istruzioni determinano condizioni valide
printf( "ESECUZIONE DEL BLOCCO DI ISTRUZIONI nel ciclo #%d\n", i+1 );
printf( " val prima dell'operazione: %d\n", val );
val += inc;
printf( " val dopo l'operazione val+=inc: %d\n", val );
}
return 0;
}
Probabilmente è più esplicito quel che manda in uscita che non il codice in sè:
INIZIALIZZAZIONE
val = 37
lim = 50
inc = 10
i = 0
CONTROLLO CONDIZIONALE prima del ciclo #1
printf() riuscita
val<=lim: vero
i<5: vero
ESECUZIONE DEL BLOCCO DI ISTRUZIONI nel ciclo #1
val prima dell'operazione: 37
val dopo l'operazione val+=inc: 47
OPERAZIONI IN CHIUSURA DEL CICLO #1
i incrementato a 1
CONTROLLO CONDIZIONALE prima del ciclo #2
printf() riuscita
val<=lim: vero
i<5: vero
ESECUZIONE DEL BLOCCO DI ISTRUZIONI nel ciclo #2
val prima dell'operazione: 47
val dopo l'operazione val+=inc: 57
OPERAZIONI IN CHIUSURA DEL CICLO #2
i incrementato a 2
CONTROLLO CONDIZIONALE prima del ciclo #3
printf() riuscita
val<=lim: falso, interrompi il ciclo
i<5: vero
Process returned 0 (0x0) execution time : 0.094 s
Press any key to continue.
Se invece che su 10 inc viene inizializzato con 20, si ottiene questo:
INIZIALIZZAZIONE
val = 37
lim = 50
inc = 20
i = 0
CONTROLLO CONDIZIONALE prima del ciclo #1
printf() riuscita
val<=lim: vero
i<5: vero
ESECUZIONE DEL BLOCCO DI ISTRUZIONI nel ciclo #1
val prima dell'operazione: 37
val dopo l'operazione val+=inc: 57
OPERAZIONI IN CHIUSURA DEL CICLO #1
i incrementato a 1
CONTROLLO CONDIZIONALE prima del ciclo #2
printf() riuscita
val<=lim: falso, interrompi il ciclo
i<5: vero
Process returned 0 (0x0) execution time : 0.218 s
Press any key to continue.
Se ti ho confuso le idee, perdonami ed ignorami. Apprezza però la buona volontà e lo "spirito di corpo"!
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.