Newsgroup: it.comp.lang.c++
Titolo: Mmmm....x++....++x..... queste notazioni sono stranucce >:|

Salve gente,
vi chiedo numi su questo fatto che mi capita sia in c che in c++
dichiaro uan variabile intera int b=0;
e subito dopo ne stampo sia ++b che b++
Ottengo alcuni risulktati che non capisco 
cout << ++b << " e " << ++b;    -----------> 2 e 2  [????]
oppure 
cout << ++b << " e " << b++;  ------------> 2 e 0 [?????]
oppure 
cout << b++ << " e " << ++b;  -------------> 1 e 2  [?????]
oppure 
cout << b++ << " e " << b++; --------------> 1 e 0  [????]
Cioč....mi aspettavo dei risultati compeltamenet difefrenti:
credevo che ( ad esempio nel primo caso ) venisse incrementata b e
subito dopo stampata ( 1 quindi ) , poi stampava e , poi incerementava
di nuovo b e la stampava ( 2 quindi )........... cioč il mio output
sarebbe stato 1 e 2 ...........mi spiegate per cortesia a cosa si
dovuta questa cosa?
Alcuni9 mi hanno detto che si deve priocedere da DX invece che da SX
......ma continuano a non tornarmi le cose.....
Grazie a tutti 
ciaoooo 

......ma continuano a non tornarmi le cose.....
in c++ come nei linguaggi che supportano le standard call .. i
parametri vengono passati dall'ultimo (a destra) al primo (a sinistra)
...
quindi il tuo compilatore quando traduce il codice fa la seguente
operazione
[SALVATAGGIO VALORE b] [ b = 0]
INCREMENTO DI B [ b = 1 ] (b++)
INCREMENTO DI B [ b = 2 ] (++b)
[SALVATAGGIO VALORE B] [b = 2]
ciao
Antonio

 cout << ++b << " e " << ++b;    -----------> 2 e 2  [????]
Undefined behaviour; b e' modificato ed usato senza un sequence point
intermedio.  Leggere nella FAQ list di comp.lang.c, sotto la URL
http://www.eskimo.com/~scs/C-faq/top.html
, la Q/A 3.1 e le seguenti
--- dove la cosa e' spiegata in dettaglio.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy          loreti at pd dot infn dot it

Ti semplifico la vita
int k, i=4, j=10;
k=i++ +j;
e' equivalente a
k= i+j;
i=i+1;
restituisce
k=14 ed i=5;
k= ++ i +j;
e' equivalente a
i=i+1;
k= i+j;
restituisce
k=15 ed i=5;
Questo esempio dovrebbe essere piu' chiaro di mille parole.
Spero di esserti stato utile Ciao.

--- dove la cosa e' spiegata in dettaglio.
ho dato un'occhiata ...non è che ci capisca molto essendo alle prime
armi.
Mi sembra di capire da alcune domande che ho visto nelle faq che è
sconsigliato quindi usare queste espressioni combiate tra loro?
E' chiaro che il mio esempio era solo per poter capire come
funzionavano queste notazioni ...... avevo capito come funzionavano da
sole ed ho voluto provare cosa succedeva se fossero mescolate con
altre........credo che quindi non le userò mai :)))) o almeno proverò
ad evitarle 
Grazie a tutti per le risposte :)))
ciaooo 

armi.
Pur essendo vero che l'espressione che hai scritto e'
"undefined behaviour" (e questo implica che potrebbe
succedere *qualunque* cosa quando lanci il programma)
penso che il tuo problema fosse *anche* un'altro.
Quando in C++ per chiamare una funzione scrivi
    f(a(),b(),c());
il compilatore e' libero di chiamare a(), b() e c()
nell'ordine che preferisce. Se il tuo programma
richiede un ordine specifico allora devi spezzare
l'espressione esplicitamente:
    va=a(); vb=b(); vc=c(); f(va,vb,vc);
Una cosa che trae in inganno e' la notazione usata
per gli stream di output... che porta a pensare ad
una sequenza. In realta' quando si scrive
   std::cout << a() << b() << c();
non e' affatto detto che venga chiamata prima a,
poi b e per ultima c. Senz'altro l'output viene
fatto in sequenza, ma il calcolo potrebbe seguire
un ordine arbitrario. Qualcuno pensa che questo non
sia vero grazie al fatto che ogni operazione di
output deve essere fatta sullo stream restituito
dall'operazione di output precedente ma e' importante
non confondere la precedenza con l'ordine di
valutazione che sono cose molto distinte.
Ad esempio se scrivo:
    x = f()*g()+h();
e' sicuramente vero che la somma viene fatta dopo
la moltiplicazione... ma non e' detto che la
funzione h() sia chiamata per ultima.
Questa "liberta'" di azione concessa al compilatore
(che crea qualche problema ai programmatori) e' stata
lasciata per dare piu' possiblita' di ottimizzazione.
Sempre per lasciare possibilita' di ottimizzazione
viene anche "promesso" che non si cerchera' mai di
modificare in una espressione uno stesso valore piu'
di una volta, oppure di modificarlo in una parte e
leggerlo in un'altra se fra questi punti non
esistono vincoli di sequenzialita'. Ad esempio...
   int x=0;
   int y = ++x + x;
in questa espressione x viene letto e modificato
(da ++x) e utilizzato anche come secondo operando
del "+". Qualcuno pensa che il risultato possa
essere 1 oppure 2... in realta' il risultato
potrebbe essere qualunque cosa (incluso un crash
del programma) perche' non si sta rispettando la
promessa di non modificare e leggere un valore
in punti non legati da vincoli di sequenzialita'.
HTH
Andrea