PROGRAMMIAMO
C++ - Valore di ritorno
Funzioni che non hanno valore di ritorno

Come sappiamo, una funzione senza valore di ritorno è una funzione di tipo void, che non restituisce nessun risultato di calcolo. Le funzioni di tipo void in C++ non hanno bisogno di usare l'istruzione return al proprio interno, dal momento che in effetti non ritornano nulla al chiamante.

Per fare un esempio, consideriamo la seguente funzione void che introduce un ritardo nell'esecuzione di un programma:

// Genera un ritardo di "millisec" millisecondi
void ritardo(int millisec)
{
int fine;
fine= millisec + clock();
while(fine>clock());
}

La funzione è abbastanza semplice. Il parametro intero millisec contiene il valore in millisecondi del ritardo che si vuole generare (es. 1000 equivale a un secondo di ritardo).

La funzione di library clock() torna il numero di millisecondi trascorsi dall'avvio del programma. Pertanto l'istruzione

fine= millisec + clock();

inizializza la variabile fine con il valore del tempo corrente (in millisecondi) incrementato di millisec. In pratica fine contiene il tempo finale misurato in millisecondi.

Il ciclo vuoto

while(fine>clock());

serve per continuare a chiamare la funzione clock() fintantoché il suo valore non supera fine (cioè fintantoché non è scaduto il tempo di ritardo specificato).

Si osservi che la funzione non usa l'istruzione return, come detto all'inizio. In pratica le parentesi graffe che chiudono la funzione eseguono una sorta di "return implicito": terminano l'esecuzione della funzione e tornano il controllo al chiamante, senza inviare nessun valore.

Tuttavia l'istruzione return (senza nessuna variabile o valore) può essere usata anche in una funzione void con lo scopo di provocarne la chiusura anticipata. Consideriamo ad esempio la seguente funzione che richiede all'utente l'inserimento di una semplice password numerica per sbloccare l'esecuzione del programma:

void password(void)
{
int codice;
while(1)
  {
  cout<<"Digitare il codice segreto per sbloccare il programma: ";
  cin>>codice;
  if (codice==1234)
    return;
  }
}

Si osservi l'uso dell'istruzione return senza alcun valore, con lo scopo di terminare la funzione e di restituire il controllo al main (l'istruzione return è più forte di un semplice break, poiché interrompe non solo il ciclo, ma l'intera funzione).

 

Funzioni che sembrano avere più di un valore di ritorno

Abbiamo affermato che ogni funzione può avere un solo valore di ritorno (o nessuno, se si tratta di una funzione void). Questo però non significa che in una funzione non ci possa essere più di un'istruzione return. Naturalmente ad ogni chiamata della funzione solo uno dei return verrà eseguito e dunque il valore tornato è sempre uno e uno solo.

Si consideri per esempio la seguente funzione bisestile, usata per determinare se un dato anno è bisestile oppure no:

int bisestile(int anno)
{
if(anno%400==0)
  return 1;

if(anno%4==0 && anno%100!=0)
  return 1;

return 0;
}

Un anno è bisestile (cioè ha 366 giorni) quando è multiplo intero di 4 (es. il 1992 era bisestile, come pure il 1996, mentre il 1993 e il 1994 non lo erano). In pratica c'è un anno bisestile ogni 4 anni.

Fanno eccezione i secoli (1900, 2000 etc.) che sono sempre multipli di 4, ma che sono bisestili solo ogni 400 anni (il 1600 era bisestile come pure il 2000, mentre il 1700, 1800 e 1900 non lo erano).

Fatta questa premessa, possiamo dare un'occhiata al codice della funzione. Occorre anzitutto sapere che in C, quando si deve realizzare una funzione per verificare una data condizione, di solito si associa il valore intero 1 alla condizione vera e il valore 0 alla condizione falsa. In pratica la funzione bisestile torna 1 se l'anno è bisestile e torna 0 altrimenti.

Si osservino ora i tre return all'interno della funzione. A ogni chiamata ne viene eseguito sempre uno solo e precisamente:

Si noti anche che gli if non usano l'istruzione else, perché questa non è necessaria dopo un return: infatti l'istruzione return termina in ogni caso l'esecuzione della funzione e non occorre prevedere un'istruzione alternativa (else) per l'if. In altre parole, la seguente scrittura della funzione bisestile è solo più complicata, ma funziona esattamente allo stesso modo:

int bisestile(int anno)
{
if(anno%400==0)
  return 1;
else if(anno%4==0 && anno%100!=0)
  return 1;
else
   return 0;
}

 

 

link precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it