L'indentazione ha fondamentalmente una sola regola: tutte istruzioni che appartengono ad una struttura (if/for/while/switch ecc) vanno incolonnate un po' a destra rispetto alla riga di inizio della struttura (e una struttura interna va considerata come un'istruzione):
Codice: Seleziona tutto
istruzione
while <condizone>
istruzione appartenente a while
istruzione appartenente a while
if <condizone> (if appartenente a while)
istruzione appartenente a if
istruzione appartenente a if
istruzione appartenente a while
istruzione appartenente a while
istruzione
istruzione
Il linguaggio può richiedere la presenza sintattica di delimitatori per identificare i blocchi di istruzioni appartenenti ad una struttura, ad esempio in C si usano le graffe:
Codice: Seleziona tutto
if (NULL == v)
{
printf("errore nella reallocazione, esco!\n");
exit(0);
}
Esempio di codice con indentazione errata, si fa davvero fatica a capire quali istruzioni appartengono alle varie strutture, e per capirlo con sicurezza bisogna mettersi a spulciare le parentesi graffe:
Codice: Seleziona tutto
for (;;) {
printf ("numero_colonna ");
scanf ("%d",&x);
for (i=0; i<size; i++)
{
v[i]=v[i+1];
}
v[size-1]=x;
stampa (v,size);
printf ("aggiungi numero in coda? (s)");
k=getchar();
if ((k=getchar())=='s')
{
v = (int*) realloc( v, (size+1)*(sizeof(int)) );
if (NULL==v) {
printf ("errore nella reallocazione, esco!\n");
exit(0);}
printf ("numero da mettere in coda ");
scanf ("%d",&num_coda);
inserisci_coda (v,&size,num_coda);
stampa (v,size);
}
}
Un codice non correttamente indentato si riconosce anche dal fatto che togliendo le parentesi diventa completamente impossibile comprendere la logica del programma, in quanto non si riesce più a distinguere a quali strutture appartengono le varie istruzioni e quindi non se ne può seguire il flusso logico dell'esecuzione.
Codice: Seleziona tutto
for (;;)
printf ("numero_colonna ");
scanf ("%d",&x);
for (i=0; i<size; i++)
v[i]=v[i+1];
v[size-1]=x;
stampa (v,size);
printf ("aggiungi numero in coda? (s)");
k=getchar();
if ((k=getchar())=='s')
v = (int*) realloc( v, (size+1)*(sizeof(int)) );
if (NULL==v)
printf ("errore nella reallocazione, esco!\n");
exit(0);
printf ("numero da mettere in coda ");
scanf ("%d",&num_coda);
inserisci_coda (v,&size,num_coda);
stampa (v,size);
Il codice seguente invece è indentato correttamente, già a colpo d'occhio non vi è alcun dubbio sull'ordine gerarchico delle istruzioni, si nota benissimo ciò che appartiene a un ciclo o a un if, perché è chiaramente spostato a destra rispetto al rispettivo inizio ciclo o inizio if:
Codice: Seleziona tutto
for (;;)
{
printf("numero_colonna ");
scanf("%d", &x);
for (i=0; i<size; i++)
{
v[i] = v[i+1];
}
v[size-1] = x;
stampa(v, size);
printf("aggiungi numero in coda? (s)");
k = getchar();
if ((k=getchar()) == 's')
{
v = (int*) realloc( v, (size+1)*(sizeof(int)) );
if (NULL == v)
{
printf("errore nella reallocazione, esco!\n");
exit(0);
}
printf("numero da mettere in coda ");
scanf("%d", &num_coda);
inserisci_coda (v, &size, num_coda);
stampa (v, size);
}
}
In un codice indentato correttamente anche togliendo le parentesi la logica rimane perfettamente comprensibile, perché quello che conta è la posizione relativa delle istruzioni tra di loro (ottenuta applicando la regola descritta all'inizio):
Codice: Seleziona tutto
for (;;)
printf("numero_colonna ");
scanf("%d", &x);
for (i=0; i<size; i++)
v[i] = v[i+1];
v[size-1] = x;
stampa(v, size);
printf("aggiungi numero in coda? (s)");
k = getchar();
if ((k=getchar()) == 's')
v = (int*) realloc( v, (size+1)*(sizeof(int)) );
if (NULL == v)
printf("errore nella reallocazione, esco!\n");
exit(0);
printf("numero da mettere in coda ");
scanf("%d", &num_coda);
inserisci_coda (v, &size, num_coda);
stampa (v, size);
In sostanza le parentesi o altri delimitatori sono solo una necessità sintattica in più del linguaggio, e possono essere disposte in diversi modi (purché continuino a racchiudere le stesse parti), ma il codice va comunque sempre scritto come se non ci fossero, e deve sempre restare leggibile anche togliendole.