Newsgroup: it.comp.lang.c
Titolo: incremento

ciao,
ho un dubbio a proposito degli operatori di incremento/decremento 
prefissi/postfissi.
dunque supponiamo che abbio dichiarato e inizializzato una variabile 
come segue:
int k = 0;
poi scrivo la seguente istruzione:
k = k++;
che equivale a:
(k = (k++));
se ho capito bene, per prima cosa il compilatore valuta l'espressione 
(k++), che vale 0. dopo la valutazione, il compilatore può incrementare 
la variabile in qualunque momento (lo standard non specifica l'istante 
esatto in cui questo incremento debba essere fatto). dato quindi che le 
cose rimaste da fare sono l'assegnamento e l'incremento, ci sono due casi:
A) prima l'assegnamento, poi l'incremento
in questo caso la varibile k dovrebbe valere 1
B) prima l'incremento, poi l'assegnamento
in questo caso la variabile k dovrebbe valere 0
il compilatore giustamente mi segnala:
incremento.c: In function `main':
incremento.c:7: warning: operation on `k' may be undefined
fin qui tutto ok. al posto dell'istruzione precedente mettiamo ora questa:
k = ++k;
che equivale a:
(k = (++k));
se ho capito bene, per prima cosa il compilatore incrementa la variabile 
k (che quindi assume il valore 1), e poi valuta l'espressione (++k) (che 
vale sempre 1), quindi effettua l'assegnamento. in questo caso k 
dovrebbe valere 1 e non dovrebbero esserci dubbi. in realtà il 
compilatore mi segnala, anche in questo caso:
incremento.c: In function `main':
incremento.c:7: warning: operation on `k' may be undefined
probabilmente però ho interpretato male l'operatore prefisso di 
incremento. forse il significato è il seguente: per prima cosa il 
compilatore valuta l'espressione (++k), che vale 1. dopo la valutazione, 
il compilatore può incrementare la variabile in ogni momento. dato che 
le cose rimaste da fare sono l'assegnamento e l'incremento, ci sono due 
casi:
A) prima l'assegnamento, poi l'incremento
in questo caso la varibile k dovrebbe valere 2
B) prima l'incremento, poi l'assegnamento
in questo caso la variabile k dovrebbe valere 1
è così?
ad ogni modo durante l'esecuzione ottengo a=0 nel caso dell'operatore 
postfisso, e a=1 nel caso dell'operatore prefisso (quindi il mio 
ragionamento sembra compatibile con i risultati "sperimentali").
grazie.

(k = (k++));
No, equivale a un "comportamento indefinito".

Andrea Laforgia ha scritto:

Domanda:
se invece di fare "k = k++;" (che ha un comportamento indefinito), uno
facesse direttamente "k++;"?
David
-- 
Linux Registered User #334216
Get FireFox! >> 
http://www.spreadfirefox.com/?q=affiliates&id=48183&t=1
Staff >> 
http://www.debianizzati.org
 <<

facesse direttamente "k++;"?
k=k+1;

Andrea Laforgia ha scritto:

mmmh ok... :)
ma k++ non va? (io la uso in php questa sintassi... ed è pure più
compatta :P)


compatta :P)
Non hai capito.  In C puoi scrivere "k++;" che equivale a "k=k+1;".

Andrea Laforgia ha scritto:

Si, lo sapevo già... allora la tua era solo un'aggiunta... un pò più di
chiarezza non guasterebbe :)


un pò più di chiarezza non guasterebbe :)
Non guasterebbe neanche un po' più di intelligenza.

 Non guasterebbe neanche un po' più di intelligenza.
Eh, non cominciamo ad offendere: non mi sembra di averti offeso
dicendoti che non sei stato chiaro. Tu invece mi stai offendendo
dicendomi che non sono stato intelligente. Cominciamo a pesare le
parole, grazie.


Andrea Laforgia ha scritto:

perchè k = k++ non equivale a (k = (k++))?? ho semplicemente applicato 
la priorità degli operatori... il fatto che si tratti di un 
comportamento indefinito è una questione successiva... IMHO


Hai applicato la precedenza degli operatori, ma non hai applicato la 
regola che dice che se fra due sequence point un lvalue viene modificato 
più di una volta, il comportamento è indefinito e il programma non è 
valido (e non c'è obbligo di diagnostica, quindi il compilatore non è 
obbligato a dirti che è un errore).