Funzioni in C: dichiarazione, sintassi ed esempi

Una funzione, nel linguaggio C, può essere vista come un insieme di istruzioni che hanno lo scopo di svolgere un particolare compito. In particolare le funzioni vengono definite per evitare di ripetere parti di codice e, di conseguenza, per rendere più efficiente e organizzato il programma. Ogni programma in C possiede almeno una funzione, ovvero la funzione main(), ma oltre a questa possono essere definite ulteriori funzioni.

Il blocco di codice definito all’interno di una funzione viene eseguito ogni volta che avviene l’operazione di invocazione, detta anche chiamata di funzione, della funzione richiesta. 

Nota: Una funzione verrà eseguita tante volte quante il numero delle sue invocazioni.

Il linguaggio C permette di invocare funzioni che sono già state definite ed implementate attraverso l’utilizzo di particolari librerie. Ad esempio la libreria stdio.h fornisce varie funzioni tra cui anche la funzione printf.

Dichiarazione di funzione in C

La dichiarazione di una funzione, come nel caso delle variabili, serve per comunicare al compilatore il nome, il numero ed i tipi degli argomenti, e il tipo del valore di ritorno. Le dichiarazioni delle funzioni vengono abitualmente definite in cima al file prima della funzione main, mentre i corpi delle funzioni possono essere definiti separatamente. Di seguito viene riportata la sintassi della dichiarazione di una funzione:

tipo_ritorno nome_funzione(lista_parametri);

dove tipo_ritorno indica il tipo del valore restituito dalla funzione, nome_funzione indica il nome con cui la funzione può essere invocata e lista_parametri contiene l’insieme dei parametri di cui la funzione ha bisogno per poter eseguire il proprio blocco di codice.

Una funzione in C non deve per forza restituire un valore e in tal caso si utilizza il termine void come tipo_ritorno.

Nota: La dichiarazione di una funzione risulta essere obbligatoria solo nel caso in cui si voglia chiamare la funzione prima della sua definizione.

Di seguito viene riportato un esempio di dichiarazione di una funzione chiamata "somma" che richiede due variabili di tipo int come parametri e che restituisce un valore intero.

int somma(int a, int b);

Non è obbligatorio inserire il nome dei parametri all’interno della dichiarazione delle funzioni, di conseguenza la dichiarazione precedente risulta essere equivalente alla seguente:

int somma(int, int);

Definire una funzione in C

Una funzione per poter essere utilizzata deve essere definita, in particolare la sua definizione deve essere posizionata prima della funzione main nel caso in cui non è presente la dichiarazione della funzione, oppure anche dopo il main se la funzione è stata precedentemente dichiarata. La struttura generale delle funzione nel linguaggio C è la seguente:

tipo_ritorno nome_funzione(lista_parametri){    corpo della funzione }

dove tipo_ritorno indica il tipo di dato del valore restituito dalla funzione. Da notare che le funzioni possono anche non restituire alcun valore, in questo caso viene utilizzato la keyword void. Il nome_funzione indica il nome della funzione con cui può essere chiamata, lista_parametri indica i parametri di input di cui necessità la funzione. 

Questi tre elementi risultano essere identici a quelli presenti nella dichiarazione della funzione, specificamente i loro valori devono essere identici a quelli definiti durante la dichiarazione della funzione (se presente), altrimenti potrebbe essere interpretata come una nuova funzione.

Il corpo della funzione, invece, contiene tutte le istruzioni di cui ha bisogno per effettuare le operazioni desiderate e l’istruzione return (se la funzione non ha il tipo_ritorno di tipo void) che specifica il valore da restituire al termine dell’esecuzione della funzione. Chiaramente il tipo del valore restituito deve essere compatibile con il tipo_ritorno specificato dalla funzione.

Nota: se la funzione non ha bisogno di alcun input, allora la lista_parametri può anche essere vuota.

Esempio definizione di funzione

Di seguito vengono riportati tre esempi di definizione di funzione. La prima funzione, chiamata "somma", richiede due parametri interi in ingresso e restituisce un valore intero corrispondente alla somma dei due parametri inseriti.

int somma(int a, int b){     int s = a + b;     return s; }

La seconda funzione, chiamata "val", non richiede alcun valore in ingresso e restituisce un valore intero.

int val(){     return 10; }

Mentre la terza funzione, chiamata "saluta", non richiede alcun valore in ingresso e non restituisce alcun valore, ma stampa solamente su schermo un testo. Dato che la funzione non restituisce alcun valore il tipo_ritorno sarà di tipo void.

void saluta(){     printf("Ciao!"); }

Invocazione o chiamata di una funzione in C

Come precedentemente accennato, l’invocazione, detta anche chiamata, di una funzione è l’operazione che permette l’esecuzione della funzione. Quando il programma esegue la chiamata di una funzione, la normale esecuzione del programma si ferma e passa all'esecuzione del blocco di codice definito nella funzione invocata. Una volta eseguita l’istruzione return o raggiunta la chiusura della parentesi graffa, il compilatore riprende la normale esecuzione del programma dall’istruzione successiva alla chiamata di funzione.

Per poter effettuare la chiamata di una funzione, bisogna chiamare la funzione con il suo nome corretto e passare gli argomenti richiesti, inoltre se la funzione restituisce un valore, questo può essere immagazzinato usando un’apposita variabile. Di seguito vengono riportati alcuni esempi di invocazione delle funzioni precedentemente definite.

int x = somma(2, 3); int y = val(); saluta();

Esempio funzioni in C

In questa sezione vengono riportati alcuni esempi completi di alcune funzioni in C.

Il primo esempio contiene le tre funzioni precedentemente definite, comprese le loro dichiarazioni, definizioni ed invocazioni.

#include <stdio.h> int somma(int a, int b); int val(); void saluta(); void main(){     int x = somma(2, 3);     printf("%d\n", x);     int y = val();     saluta(); }   int somma(int a, int b){     int s = a + b;     return s; } int val(){     return 10; } void saluta(){     printf("Ciao!\n"); } /* —-- OUTPUT —-- 5 Ciao! */

Nel seguente esempio, invece viene definita una funzione "max" che dati in input due valori interi, restituisce il numero più grande tra i due.

#include <stdio.h> int max(int x, int y){     if(x > y)         return x;     else if (x < y)         return y;     else         return x; //In questo caso x e y sono uguali, quindi possiamo restituire uno dei due valori } void main(){     int m = max(5, 5);     printf("Il numero piu' grande e': %d\n", m); }  

Da notare che in questo caso è stato deciso di definire la funzione "max" prima della sua invocazione, di conseguenza non è richiesta la sua dichiarazione.