PDA

View Full Version : Incremento e decremento variabili


djadry
16-11-2011, 22:44
Scusate se chiedo una cosa che potrebbe sembrare stupida ma mi ci sto spaccando la testa :muro:

Il problema è questo:
Siano x e y due variabili di tipo int. Indicare i valori che conterrà ciascuna delle due variabili dopo l'esecuzione dei seguenti frammenti di codice, nell'ipotesi che prima dell'esecuzione di ciascuno di essi x contenga 3 e y contenga 3.

x = x-- + ++y;
x = y + ++y - x;
y = x + y;

I risultati dovrebbero essere x = 3 ed y = 8. Ma a me non vengono proprio! A me risulta x = 2 ed y = 7 con i seguenti passaggi:
x = 3 + 4
x = 4 + 5 - 7
ed y = 2 + 5.


Invece nell'esercizio precedente con:
x = ++x + ++y;
y = y-- + y - x;
y = x + y;
mi risultano giusti x = 8 ed y = 7 con x = 4 + 4 , y = 4 + 3 - 8 ed y = 8 -1

mi viene il dubbio che il prof possa avere sbagliato :rolleyes:
grazie a chi mi aiuterà! ;)

campo23
16-11-2011, 23:00
viene x=3 e y=8 se quando hai x=3+4, decrementi il valore di x visto che c'è x--, infatti viene x=3+4-1=6 x=4+5-6=3 y=5+3=8

djadry
17-11-2011, 08:46
viene x=3 e y=8 se quando hai x=3+4, decrementi il valore di x visto che c'è x--, infatti viene x=3+4-1=6 x=4+5-6=3 y=5+3=8

ma quindi avere x-- vuol dire utilizzare la stessa variabile e anche decrementarla nella stessa operazione?

non ho capito da dove esce il x=3+4-1 :confused:

banryu79
17-11-2011, 09:31
E' meglio analizzare bene ogni singola riga.

Devi tenere a mente che gli operatori di incremento (++) e decremento (--) esistono sia nella forma prefissa (--x) che postfissa (x++).
La differenza tra le due forme è la precedenza dell'operatore rispetto agli altri: nella forma prefissa l'operatore ha un'alta precedenza, percui viene eseguito prima degli altri, mentre nella forma postfissa ha una bassa precedenza, adiritttura più bassa dell'operatore '=', percui viene eseguito per ultimo.

Si parte con x = 3 e y = 4.

Prima riga:

x = x-- + ++y;

Nota che, per via della bassa precedenza, l'operatore di decremento postfisso (x--) verrà eseguito su x solo dopo l'assegnazione '='.
Quindi, scoponendo e sostituendo, l'ordine delle operazioni è il seguente:

(x = 3, y = 3)

1. x = x-- + ++y // 3-- + (++3) => 3(--) + 4 => 7 => x = 7
2. ++y // ++3 => 4 => y = 4
3. x-- // 7-- => 6 => x = 6

(x = 6, y = 4)


Seconda riga:

x = y + ++y - x;

Scomponiamo:

(x = 6, y = 4)

1. x = y + (++y) - x // 4 + (++4) - 6 => 4 + 5 - 6 => 3 => x = 3
2. ++y // ++4 => 5 => y = 5

(x = 3, y = 5)


Terza riga:

y = x + y;

Scomponiamo:

(x = 3, y = 5)

1. y = x + y // 3 + 5 => 8 => y = 8

(x = 3, y = 8)

djadry
17-11-2011, 18:48
grazie!

ok mi viene. però non mi viene più il primo con questo metodo.

codice:
x = ++x + ++y;
y = y-- + y - x;
y = x + y;

prima riga:
x = ++x + ++y -> x = 4 + 4 = 8
++x -> ++8 = 9 -> x = 9
++y -> ++3 = 4 -> Y = 4

seconda riga:
y = y-- + y - x -> y = 4 + 4 - 9 = -1
y-- -> -1-- = -2 -> Y = -2

terza riga:
y = x + y -> y = 9-2 = 7

dove sbaglio? :cry:

cirano994
17-11-2011, 19:59
Il Pre-Incremento (++x) non tocca il valore dell'assegnamento (mentre il Post-Incremento si, come è stato spiegato), quindi

x=3,y=3;

x= ++x + ++y;
x= 1+3 + 1+3;
x=8;

poi

y= y-- + y -x;
y= 4(-1) + 4 -8;
y=0 ---> y=-1

infine

y=x+y;
y= 8 + (-1)
y=7

Chiaro?

Sbagli nella prima riga quando consideri il ++x dopo l'assegnamento, mentre va considerato prima.

Ciao

doccod
18-11-2011, 13:57
<ot>

grazie per il mal di testa che mi avete fatto venire

</ot>

djadry
18-11-2011, 14:17
ok, ora è chiaro. grazie! :D

gugoXX
18-11-2011, 20:36
Fino a che resta uno studio va bene.
Ma effettivamente una scrittura come
x = x++
non ha molto senso.

x++ stessa e' gia' un'operazione di assegnazione.

djadry
21-11-2011, 23:24
Fino a che resta uno studio va bene.
Ma effettivamente una scrittura come
x = x++
non ha molto senso.

x++ stessa e' gia' un'operazione di assegnazione.

come spaccarsi la testa inutilmente :Prrr: