Newsgroup: it.comp.lang.c++
Titolo: l'ordine di valutazione.

E' possibile determinare a priori il risultato di un programma come questo?
// Test.cpp
#include <stdio.h>
static void print3(char* a, char* b, char* c) {
   printf("%s%s%s\n", a, b, c);
}
int main(void) {
   char *s = "one ";
   print3(s, s, s);
   print3(s, s="two ", s="three ");
   return 0;
}
ovvero : C++ definisce l'ordine di valutazione delle espressioni?
Grazie 1000 a tutti
--
"...Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno
sprovveduto che non lo sa e la inventa...".
             Albert Einstein

 ovvero : C++ definisce l'ordine di valutazione delle espressioni?
Undefined behavior.  Manca un sequence point tra l'accesso a s e la
sua modifica.  Puo' stampare qualsiasi cosa, o magari formattarti il
disco fisso.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy          loreti at pd dot infn dot it

 writes:
|
|| E' possibile determinare a priori il risultato di un programma come
questo?
||
|| // Test.cpp
|| #include <stdio.h>
|| static void print3(char* a, char* b, char* c) {
||    printf("%s%s%s\n", a, b, c);
|| }
|| int main(void) {
||    char *s = "one ";
||    print3(s, s, s);
||    print3(s, s="two ", s="three ");
||    return 0;
|| }
||
|| ovvero : C++ definisce l'ordine di valutazione delle espressioni?
|
| Undefined behavior.  Manca un sequence point tra l'accesso a s e la
| sua modifica.
cosa intendi per sequence point ?
|Puo' stampare qualsiasi cosa,
E' la mia teoria, contrapposta a quella di un mio amico che dice che in c++
la sequenza e' da sinistra a destra e che quindi stamperebbe 'one two three'
|o magari formattarti il disco fisso.
LOL :)

 LOL :)
attento a non prenderla troppo sotto-gamba; probabilmente non ti 
formattera` il disco fisso ma stai attento che "undefined behaviour" non 
significa "stampera` one two three in un qualsiasi ordine"; significa 
proprio che non e` possibile prevedere cosa succedera`: potrebbe non 
accadere nulla, o potrebbe crasharti il programma. E quel che e` peggio 
e` che potrebbe funzionare per molti mesi e poi smettere 
improvvisamente. Morale della favola: stai attento agli undefinded 
behaviour ;-)
ciao Anto
-- 
Antonio Cuni, 20 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it


Il risultato č indefinito.
Ho provato a compilare il tuo programma con g++, senza ottimizzare stampa
'two two three', con -O9 stampa 'three two three', ovvero il risultato č
indefinito.

ascoltando il vento dell'est udii Terra che diceva queste parole
| Il risultato č indefinito.
| Ho provato a compilare il tuo programma con g++, senza ottimizzare stampa
| 'two two three', con -O9 stampa 'three two three', ovvero il risultato č
| indefinito.
Grazie della conferma!
PS: Cosa fa l'opzione  -O9 ?

 ha scritto nel messaggio
news:ah8bdt$r1thh$1...@ID-95523.news.dfncis.de...

Ottimizza di piů di -O, -O2, ...   :-)

 LOL :)
Scherzi, ma teoricamente non e' impossibile.

ascoltando il vento dell'est udii Andrea che diceva queste parole
--cut
||| Puo' stampare qualsiasi cosa,
||
|| E' la mia teoria, contrapposta a quella di un mio amico che dice che in
c++
|| la sequenza e' da sinistra a destra e che quindi stamperebbe 'one two
three'
|
| Bebeto, il mio gatto, ha una teoria diversa ;)
|
ROTFL :)
||| o magari formattarti il disco fisso.
||
|| LOL :)
|
| Scherzi, ma teoricamente non e' impossibile.
Grazie della chiara spiegazione.

 ha scritto nel messaggio
| news:ah8bdt$r1thh$1...@ID-95523.news.dfncis.de...
|| ascoltando il vento dell'est udii Terra che diceva queste parole
||
||
||| Il risultato č indefinito.
||| Ho provato a compilare il tuo programma con g++, senza ottimizzare
stampa
||| 'two two three', con -O9 stampa 'three two three', ovvero il risultato č
||| indefinito.
||
|| Grazie della conferma!
|| PS: Cosa fa l'opzione  -O9 ?
||
|
| Ottimizza di piů di -O, -O2, ...   :-)
LOL :)
cmq grazie, ho capito :)


Comunque il secondo e il terzo parametro sono sicuramente 'two' e 'three'
perché li assegni in quel momento. E' solo il primo parametro ad essere non
determinato.