Newsgroup: it.comp.lang.c++
Titolo: Strano problema di incremento

Segnalatomi da un collega e personalmente testato:
int x = 7;
x = x++ % 8;
x --> 8 (errato?)
int x = 7;
x = ++x % 8;
x --> 0 (giusto)
Perchč? Forse a causa del post incremento eseguito solo dopo aver
finito il corpo istruzione? Boh...
Luc.

"Luc" <TOGL...@katamail.com-TOGLI> wrote in message
news:0vgoktcmtvoml3tq8...@4ax.com...

In realta' sono entrambe undefined.
Nel primo caso il valore finale valido per X puo' essere sia 7 che 8
Nel secondo sicuramente e' valido 0 e credo possa anche essere valido 8 (devo
verificare).
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

verificare).
Se in una espressione lo stesso dato viene modificato
piu' di una volta senza un sequence point allora si
casca nell'undefined behaviour.
Questo non vuol dire che forse fa sette, forse fa otto
o forse fa zero... significa che forse cominciano a
fuoriuscirti i diavoloni dal naso :DDD
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

x = x++ % 8;
mi sembra che si un po' come fare
array[i] = i++;
dove il risultato non è definito.
Anto
--
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 casca nell'undefined behaviour.
Ecco, questo e` uno dei tanti punti che avrei voluto approfondire, ma
che per un motivo o per l'altro non ho avuto modo di fare da diversi
mesi a questa parte.
Nel caso in esame la precedenza degli operatori non risolverebbe la
faccenda?
Pre (post) incremento e` l'operatore con maggiore priorita`, seguito
da %
ed infine dall'assegnamento. O forse in C++ non e` definito l'ordine
di valutazione dei due operandi di operator=? Cosa che spiegherebbe la
questione.
Cmq di solito nei linguaggi che ho avuto modo di utilizzare prima si
valuta` l'rvalue expression e poi la lvalue....
Paolo
--
Paolo Marotta
Home: 
http://web.tiscalinet.it/paolo_marotta
Master's Level in C++ Certified by Brainbench
http://www.brainbench.com/transcript.jsp?pid=2440649

 casca nell'undefined behaviour.
E' di questo che non sono sicuro.
Lo standard sembra dire nel testo che si tratta di undefined behaviour, ma negli
esempi lo segnala come unspecified. Per questo sono dubbioso.


 valuta` l'rvalue expression e poi la lvalue....
In molti linguaggi questo e' definito. In altri, come il C++, no.


 dove il risultato non è definito.
Come dicevo poco fa, i due esempi di Luc potrebbero essere undefined behaviour
(anche se ho un piccolo dubbio interpretativo). Il tuo esempio invece e' solo
unspecified behaviour.
Nel tuo esempio (e ammesso che l'array non sia troppo corto) ci sono due soli
possibili comportamenti da parte del compilatore (quale dei due dipende
dall'implementazione, ma nient'altro e' ammesso se non uno di questi due), se i
all'inizio vale 3, allora i alla fine vale 4 e viene assegnato il valore 3 o al
terzo o al quarto elemento dell'array a seconda della temperatura.


casca nell'undefined behaviour.
undefined behaviour o implementation defined? Mi sembrerebbe più
logica la seconda (ma in C++ sono tante le cose alogiche..)


faccenda?
Una cosa e' la precedenza, una cosa e' l'ordine di valutazione degli
operandi... se scrivo:
   x = f() * g() + h();
allora e' fuori di discussione che il risultato della moltiplicazione
verra' calcolato prima della somma... pero' quello che non posso
sapere e' quale delle tre funzioni viene chiamata per prima. Potrebbe
benissimo trattarsi della funzione h().
Qualcosa in cui la gente casca spesso a questo riguardo e' l'operatore
di output su stream... se scrivo
  std::cout << f() << g() << h();
non so quale e' la funzione chiamata per prima, nonostante ciascuna
delle operazioni di output debba aspettare la valutazione della
parte alla sua sinistra per poter essere effettuata.
Questo caso e' particolarmente insidioso perche' l'operatore "<<"
ha la strana tendenza a far pensare ad una sequenza di operazioni
(cosa falsa; a questo riguardo e' un operatore come un altro).


Per questo sono dubbioso.
Vero... solo ora mi accorgo che negli esempi usa il termine
"unspecified". Dove stara' la verita' ?
In un caso o nell'altro e' comunque qualcosa da cui stare
alla larga. Il senso resta quindi:
  "se qualcuno ti dira' di scambiare due variabili
   intere con a^=b^=a^=b; tu lo picchierai con un
   enorme randello"


 si puo' ricavare dalle regole sintattiche.
In un espressione del tipo: *T++ le regole di precedenza sono esplicitamente
definite.
Prima gli operatori postfissi,poi i prefissi.
--
Ivan Molella
__LINUX__ the choice of the  __GNU__ generation