Comunque non editare i post precedenti aggiungendo commenti, altrimenti ci perdiamo qualcosa (ho notato ora che hai editato il tuo post precedente).
Riprendo il tuo edit.
Cioè se do' a a valore 3 e a b valore 5 che mi da somma 8 questi valori sono memorizzati nei parametri della funzione sommaValori ma queste variabili non sono le stesse del main? Non capisco sinceramente...
Ti da somma 8 dopo che la funzione viene eseguita, ma quando chiami la funzione, a questa vengono passati i valori 3 e 5 ed assegnati ai parametri della funzione. Tutto ciò che accade in quella funzione rimane li.
Considera questo codice, che è simile a quello che stavi facendo (tranne per il cout che non ho utilizzato):
C++:
#include<iostream>
void sommaVariabili(int a, int b, int s)
{
s = a + b;
}
int main()
{
int n1 = 2, n2 = 10, somma = 0;
sommaVariabili(n1, n2, somma);
std::cout << "somma: " << somma;
return 0;
}
l'output sarà 0, in quanto l'operazione di addizione che è stata fatta nella funzione è locale alla funzione, e la variabile "s" (il parametro) esisterà solo sino a che la funzione non sarà terminata.
Non voglio farti fare ulteriore confusione; era per sottolineare il fatto che il parametro "somma" era inutile, per quanto appena detto. Più avanti vedrete in che modo si può modificare il valore del chiamante, ma solo quando vedrete i puntatori; se non erro BAT nel primo post ha fatto un discorso simile.
Infine quando prima scrivi per questa parte:
"
void sommaValori(double a, double b)
{
cin >> a;
cin >> b;
cout << (a+b);
}
"
Se noti la funzione è "void" e significa quindi che non viene restituito nessun valore al chiamante; il chiamante è quel codice che invoca la funzione stessa, nel tuo caso il main(). "
Poichè faccio sempre fatica a capirlo perchè si dice che non restituisce alcun valore anche se in questo caso dice di fare la somma di a+b ? perchè in realtà il valore lo determina il main? puoi spiegarmelo diversamente?
Ti ringrazio molto.
Nel tuo caso la funzione non restituisce niente: effettua solo la stampa a video, ma questo non significa che dalla funzione torni un valore al chiamante.
Una funzione restituisce un valore se viene indicato nella firma della funzione un tipo di ritorno. In pratica:
C++:
void sommaValori(double a, double b);
non restituisce alcun valore al chiamante, mentre invece:
C++:
double sommaValori(double a, double b);
indica che la funzione restituisce un valore di tipo double.
Quindi in questo ultimo caso la funzione verrebbe scritta in questo modo:
C++:
double sommaValori(double a, double b)
{
return (a+b);
}
Il valore non viene determinato dal main; il valore viene restituito alla funzione chiamante (se c'è un tipo di ritorno).
In generale: quando una funzione viene eseguita e termina il suo compito, questa torna sempre al chiamante; qui c'è la differenza tra il tipo di ritorno "void" (senza alcun valore), oppure il ritorno con un determinato tipo. Se c'è il tipo di ritorno, il valore che viene restituito viene "passato" al chiamante (che normalmente lo memorizza in una variabile, o lo stampa a video).
Il chiamante è semplicemente la funzione che effettua la chiamata verso una funzione.
C++:
void f1()
{
// Corpo funzione
}
void f()
{
// corpo funzione
f1();
}
int main()
{
f();
return 0;
}
In questo caso il main chiama la funzione f. Al suo interno, la funzione f() chiama la funzione f1(). Quindi quando la funzione f1() giunge al termine, torna al chiamante, che è f(). Quando termina la funzione f(), torna al chiamante, che è main().
Il "return 0 " del main(), anche in questo caso torna al chiamante: essendo però la funzione che avvia il programma, il controllo torna al sistema operativo. Il valore 0 (come diceva qualcuno prima, non ricordo chi) indica l'esito della terminazione; normalmente il valore 0 indica che il programma è terminato senza errori.