Concetti Chiave

  • L'invocazione di una funzione avvia la sua esecuzione, sospendendo la funzione chiamante e permettendo anche l'uso di funzioni ricorsive.
  • Il valore di ritorno di una funzione è determinato dall'istruzione return, che termina l'esecuzione della funzione e restituisce un valore al chiamante.
  • La visibilità di una funzione è influenzata dalla sua dichiarazione e deve essere dichiarata prima di poter essere chiamata.
  • In C, i parametri vengono passati per valore, creando copie temporanee che non influiscono sulle variabili originali, a meno che non si utilizzino puntatori.
  • Le dichiarazioni di parametri formali possono mascherare variabili esterne con lo stesso nome, e la conversione implicita avviene se i tipi dei parametri non corrispondono.

Funzioni e invocazioni

L’invocazione o chiamata di funzione è un’operazione che permette alla funzione di essere eseguita. Quando una funzione viene chiamata nel corpo di un’altra funzione, l’esecuzione dell’ultima e sospesa, si passa all’esecuzione della prima, terminata questa si ripassa di nuovo alla funzione esterna. Una funzione che invoca se stessa viene chiamata funzione ricorsiva. Se usando una funzione ricorsiva si crea una sequenza inifinita di output, il programma prima o poi va in crash per saturazione dello stack.

Valore di ritorno

Valore di ritorno di una funzione = la funzione ritorna o restituisce un valore tramite return.

L’istruzione return causa la terminazione della funzione e il ritorno del controllo al chiamante, il valore di ritorno può essere un’espressione, ma non possono essere più valori e una funzione.

L’espressione che indica il valore di ritorno può essere sia racchiuso tra () che no, indifferentemente. Se il valore di ritorno è void, si può evitare l’istruzione return, o si può usare senza parametro.

Il valore di una funzione, al termine della funzione, viene salvata nella funzione() e il tipo di risultato deve coincidere con il tipo del valore di ritorno per evitare typecasting. Se non c’e coerenza tra tipo del valore di ritorno e il tipo del risultato della funzione, si applica la conversione implicita.

È sintatticamente possibile avere come tipo di valore di ritorno void, ma è poco pulito, questo valore viene ignorato. È anche permesso terminare una funzione non di tipo void ma senza il valore di ritorno, in questo caso il valore restituito non è predicibile, c’è quindi un comportamento non definito.

L’istruzione return causa sempre la terminazione della funzione nonostante ci sia codice sotto o meno.

Visibilità e dichiarazione

La visibilità di una funzione dipende dal punto in cui essa e dichiarata o definita. Tutte le funzioni del file possono leggerla, se però l’invocazione segue la dichiarazione. Se la dichiarazione è visibile al momento della chiamata è possibile compiere controlli tra dichiarazione e definizione.

È possibile dichiarare, ma non definire una funzione all’interno di un’altra funzione. Quella interna sarà invocabile solo da tutte le istruzioni di quella in cui è contenuta.

Parametri e passaggio per valore

Una funzione utilizza diversi parametri/argomenti:

- parametri formali, dichiarati nella dichiarazione e definizione

- parametri attuali, passati al momento della chiamata

In C il passaggio dei parametri avviene seguendo le modalità del passaggio per valore, quindi gli argomenti (parametri formali) sono variabili locali i cui valori iniziali (parametri attuali) sono passati alla funzione quando essa è invocata. La funzione non può modificare direttamente gli argomenti ma modifica solamente le copie, private e temporanee(passaggio per valore). È possibile modificare gli argomenti solo se si utilizzano i puntatori (passaggio per riferimento).

Il nome del parametro formale maschera le variabili con lo stesso nome esterne alla funzione.

Il valore del parametro formale può essere modificato nella funzione senza che abbia effetti all’esterno, ma questo non succede con scanf(), infatti riusciamo a modificare il valore di una variabile esterna.

Se il tipo di parametro attuale passato e diverso dal tipo di parametro formale si applica la conversione implicita.


Domande da interrogazione

  1. Che cosa succede quando una funzione invoca se stessa?
  2. Quando una funzione invoca se stessa, si parla di funzione ricorsiva. Se non gestita correttamente, può generare una sequenza infinita di output, causando il crash del programma per saturazione dello stack.

  3. Qual è il ruolo dell'istruzione return in una funzione?
  4. L'istruzione return termina l'esecuzione della funzione e restituisce un valore al chiamante. È importante che il tipo del valore di ritorno coincida con il tipo dichiarato per evitare problemi di typecasting.

  5. Come influisce la visibilità sulla dichiarazione di una funzione?
  6. La visibilità di una funzione dipende da dove è dichiarata. Se la dichiarazione è visibile al momento della chiamata, è possibile effettuare controlli tra dichiarazione e definizione.

  7. Qual è la differenza tra parametri formali e parametri attuali?
  8. I parametri formali sono dichiarati nella definizione della funzione, mentre i parametri attuali sono i valori passati al momento della chiamata. In C, il passaggio avviene per valore, creando copie temporanee degli argomenti.

  9. Cosa accade se si utilizza scanf() all'interno di una funzione?
  10. A differenza di altri metodi, scanf() permette di modificare il valore di una variabile esterna, poiché utilizza il passaggio per riferimento, contrariamente al passaggio per valore che crea solo copie temporanee.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community