Capire return statement in C

di il
7 risposte

Capire return statement in C

Salve a tutti,

Ho appena iniziato a studiare C e ho una domande riguardo alle funzioni e al comando return.

Una funzione, per quel che ne so, e' un insieme di istruzioni per svolgere un certo compito. Una funzione avra' degli input e produrra' degli output (so che si sono pero' funzioni che non hanno ne input ne output. Cosa fanno allora ste funzioni?)

Tornando a return, a che cosa viene inviato il valore nella return e perche'? Penso si invii informazioni in un registro della CPU. Perche'? Non ho capito bene la logica dietro a return...

grazie,
code26

7 Risposte

  • Re: Capire return statement in C

    Eppure è semplicissimo ...

    Prendi una funzione semplice come la radice quadrata che sai cosa fa.
    Quando la chiami con

    a=sqrt(b);

    come fa la funzione a passare nella variabile a il valore calcolato?
  • Re: Capire return statement in C

    Ho un po' di dimestichezza con matlab. In matlab le funzioni sono fatte cosi':

    function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)

    ci sono cioe' gli input e gli autput. Riporto un esempietto da internet:

    function max = mymax(n1, n2, n3, n4, n5)
    %This function calculates the maximum of the
    % five numbers given as input
    max = n1;
    if(n2 > max)
    max = n2;
    end
    if(n3 > max)
    max = n3;
    end
    if(n4 > max)
    max = n4;
    end
    if(n5 > max)
    max = n5;
    end

    Non c'e' nessun return da includere in Matlab. L'output chiamato max e' definito all'inizio quando si dichiara la funzione...
  • Re: Capire return statement in C

    Beh, in c non lo scrivi dopo ma quando ti serve scrivi

    return max;

    Ma ripeto, la sostanza non cambia ... È il valore restituito dalla funzione...
  • Re: Capire return statement in C

    Il codice C viene convertito in Assembly e poi in codice macchina.
    Come può fare una funzione a ritornare un valore al chiamante?
    Certo non può metterla in memoria, il chiamante non saprebbe dove andarla a ripescare, non può metterla nemmeno nello stack perché non potrebbe più ritornare al chiamate.
    Manca solo una cosa, come hai intuito viene messo in un registro, se non ricordo male su x86 viene messo in eax, su gli Avr viene messo nel r24.
    Ora che si è a conoscenza di ciò il chiamante sa dove leggere il valore di ritorno.
    Esempio sempre sugli Avr
    
    //C code
    byte fnc()
    {
        return 1;
    }
    ...
    a = fnc();
    
    
    //Assembly Avr 8bit
    fnc: ldi r24,1;carico 1 in registro24
        ret ; ritorno al chiamante
    ...
    call fnc; chiamo la funzione
    ldi r30, lo8(a); carico la posizione in memoria di A
    ldi r31,hi8(a);
    st Z,r24 ; salvo in A il valore restituito da fnc
    
  • Re: Capire return statement in C

    Salve vbextreme,

    Vediamo se ho capito: una funzione in C rappresenta un insieme di istruzioni. Una funzione ha una specifica sintassi, degli input (i parametri) ed sempre un solo output (return). Penso ci sia pero' una differenza fra i possibili output di una funzione ed la variable associata all'espressione return. Una funzione puo' avere molteplici output ma c'e' sempre solo una sola variabile associata a return.

    Consideriamo un'ipotetica funzione A che chiama un'altra funzione B. Quando la funzione B viene chiamata il codice C all'intero delle parentesi viene eseguito ed il controllo viene poi restituito alla funzione chiamante A. La funzione B puo' manipolare e/o fare operazioni sui parametri che le vengono passati. E' possibile che il risultato di una delle operazioni eseguite dalla funzione B venga restituito alla funzione chiamante A per essere utilizzato da essa nei sui comandi successivi. Questo e' lo scopo della funzione return posta alla fine del code della funzione B, vero?

    Ci sono funzioni che non ritornano nessun valore alla funzione chiamante. Perche'? Sembrerebbe una cosa poco utile per la funzione chiamante far solo eseguire il codice della funzione chiamata. Questo non vuole dire che la funzione non produca nessun output, vero?

    Riporto qui sotto un semplice programma C che usa l'espressione return:

    long int moltiplica( int var1, int var2) /* questo rappresenta il prototipo della funzione
    main ()
    {
    int a, b;
    long int risposta;
    printf("Quale e' il primo numero da moltiplicare?");
    scanf(%d, &a);
    printf("Quale e' il secondo numero da moltiplicare?");
    scanf(%d, &b);
    risposta=moltiplica(a,b)
    printf("Il prodotto e' equale a %ld.", risposta);
    return 0;
    }
    **************************
    long int moltiplica(int var1, int var2)
    {
    int risplocale;
    risplocale= var1 * var2;
    return (risplocale)
    }

    La funzione moltiplica() e' chiamata dalla funzione main() che rappresenta la funzione chiamante. La funzione moltiplica() usa i parametri a e b e produce un output rappresentato dalla variabile risposta che viene poi usata dalla funzione main() con la funzione printf(). Affinche' la funzione main() possa usare la variabile risposta prodotta dalla funzione moltiplica() e' necessario che ci sia il comando return (risplocale) nel codice di moltiplica().

    Grazie,
    code26
  • Re: Capire return statement in C

    A questo punto mi sembra tutto chiaro ... che dubbi hai ancora con la return ?

    Una funzione può non restituire valori, ad esempio, se visualizza a video dei valori o delle stringhe e non fa altro.
  • Re: Capire return statement in C

    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.
Devi accedere o registrarti per scrivere nel forum
7 risposte