code26 ha scritto:
Una funzione ha una specifica sintassi, degli input (i parametri) ed sempre un solo output (return).
Per l'esattezza, una funzione può avere
zero o
più parametri in ingresso, e restituire al chiamante
zero o esattamente un valore.
In linguaggio C, infatti, le
funzioni sono l'unica forma sintattica presente per implementare un sottoprogramma, e quindi incorporano sia la fattispecie propriamente detta della
funzione (restituisce direttamente un valore), sia quella della
procedura (non restituisce alcunché). In altri linguaggi, tipicamente imperativi, esistono modi differenti per dichiarare (e richiamare) le une o le altre: in C, una "funzione void" è invece, di fatto, l'unico modo per emulare/implementare una procedura, ossia un sottoprogramma che non restituisce alcun valore al chiamante (almeno non in modo sintatticamente esplicito e diretto).
A ciò si aggiunge il fatto che in linguaggio C, come in molti altri (dall'Algol in poi...) i vari parametri possono essere passati per
valore (copia) o per
riferimento (indirizzo, puntatore), sebbene con qualche limitazione intrinseca.
Ogni modifica apportata ai parametri passati per
riferimento è, per definizione,
visibile al chiamante e quindi in ultima analisi una qualsiasi funzione può agire su un numero virtualmente illimitato di variabili in memoria (in realtà ciò vale sia per i parametri, sia per tutte le variabili dichiarate come
static a livello di unità sintattica), e queste modifiche si propagano ad altre funzioni (incluso il main).
Per contro, le modifiche apportate alle copie sono ovviamente perdute all'uscita della funzione stessa.
Ci sono funzioni che non ritornano nessun valore alla funzione chiamante. Perche'?
Per dozzine di ottime ragioni. Ad esempio, perché interagiscono in modo profondo col sistema operativo. Oppure perché si limitano ad inviare qualcosa in output. Oppure perché modificano variabili "globali" ossia static a livello di modulo. In generale, ci sono sempre ottimi motivi per progettare e creare delle
procedure come sopra definite, ovvero nella fattispecie del C delle funzioni void che non restituiscono alcun valore al chiamante.
PS: le funzioni
restituiscono un valore. Checché ne dicano certi vocabolari
modernist, ritornare è un verbo intransitivo, senza eccezioni.