Newsgroup: it.comp.lang.c
Titolo: Delucidazione sui parametri delle funzioni

Se seguo questo programma :
void Stampa {int x, int y,int z) {
    printf("x=%d    y=%d    z=%d\n",x,y,z);
}
void main () {
int x=0;
Stampa(x++,x++,x++);
}
L'output del programma sarà :
x=2     y=1    c=0;
Avviene questo perchè i parametri vengono pushati nello stack in ordine
inverso(da destra verso sinistra);
siccome chi ha prodotto il C sapeva il fatto suo(poteva fare una cosa da
essere umano, valutare i parametri da sinistra verso destra), vorrei sapere
perchè viene fatta una cosa del genere...chi  sa spiegarmi?

 perchè viene fatta una cosa del genere...chi  sa spiegarmi?
l'ordine di valutazione di quei ++x non è definito.
http://www.gotw.ca/gotw/056.htm
-- 
sbi


Questo link ^^^ parla di C++.
Comunque anche in C l'ordine di valutazione degli argomenti è "unspecified",
non "undefined".
Dallo standard:
"3.17 unspecified behavior: Behavior, for a correct program construct and
correct data, for which this International Standard explicitly imposes no
requirements
Examples
I. An example of unspecified behavior is the order in which the arguments to
a function are evaluated."
Quindi è dipendente dall'implementazione, ma per una data implementazione è
fisso, non porterà mai ad avere "undefined behaviour".
Ciao
Ale

Quindi..non vi è nessuna regola per valutare i parametri?..su macchine
diverse si hanno risultati diversi?

 perchč viene fatta una cosa del genere...chi  sa spiegarmi?
per permettere le funzioni che accettano un numero variabile di 
argomenti. infatti passando gli argomenti sullo stack da destra a 
sinistra hai che il primo argomento (quello piů a sinistra e deve 
esistere almeno un parametro fisso) sta sempre ad una posizione fissa 
relativamente alla cima dello stack indipendentemente dal numero di 
parametri passati alla funzione.
se gli argomenti fossero messi sullo stack da sinistra a destra, non 
sapresti si quando incrementare lo stack pointer per andare a reperire i 
parametri fissi.
ciao.

 ha scritto nel messaggio
news:JK0od.371515$35.16...@news4.tin.it...


 non "undefined".
intendevo ovviamente "non è definito dallo standard",
non "non da un comportamento definito".
Resta di fatto il concetto che sia stupido affidarsi ad un comportamento 
specifico del proprio compilatore quando non si ha alcun motivo per 
_creare_ un problema.
-- 
sbi

 fisso, non porterà mai ad avere "undefined behaviour".
Non è vero, ed è molto fuorviante:
aidee% cat prova.c
#include <stdio.h>
void Stampa (int x, int y, int z)
{
    printf("x=%d    y=%d    z=%d\n", x, y, z);
}
int main ()
{
    int x=0;
    Stampa(x++, x++, x++);
}
aidee% cc -g -o prova prova.c
aidee% ./prova
x=2    y=1    z=0
aidee% cc -O3 -o prova prova.c
aidee% ./prova
x=0    y=1    z=2
Come vedi pur con la stessa implementazione, cambiando le sole opzioni di
compilazione, si ottengono risultati totalmente differenti.
Ciao.
-- 
BSD is for UNIX lovers -- linux is for Windows haters.

 ..su macchine diverse si hanno risultati diversi?
No, lo stesso programma compilato ti darą sempre lo stesso risultato 
su qualunque macchina tu lo esegua.
Perņ i programmi ottenuti stesso sorgente compilato pił volte con 
compilatori diversi, o con versoni diverse dello stesso compilatore, 
o con la stessa versione del compilatore ma usando opzioni di
compilazione differenti (vedi l'altro mio post) potrebbero dare 
risultati differenti.
Tra l'altro anche scrivere void main č un errore, main *deve* ritornare
un int.


Grazie H.P.L..ho capito qualcosa...
lo so che il main ritorna per forza un int, ma non so perchč ho scritto
void(sarŕ stato la birra del sabato :))
ciao


grazie, ottimo esempio
ciao
ale