Puoi spiegarmi l'output di questo codice Java?
int a=5,i;
i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;
System.out.println(a);
System.out.println(i);
L'uscita è 20 in entrambi i casi
Puoi spiegarmi l'output di questo codice Java?
int a=5,i;
i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;
System.out.println(a);
System.out.println(i);
L'uscita è 20 in entrambi i casi
Risposte:
questo aiuta?
a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)
a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)
Il punto principale è che ++a
incrementa il valore e lo restituisce immediatamente.
a++
incrementa anche il valore (in background) ma restituisce il valore invariato della variabile: ciò che sembra essere eseguito in seguito.
int a = 1; int b = a++; int c = ++b;
Mi aspettavo che b fosse 1 poiché è un incremento di post.
++a
incrementa e quindi utilizza la variabile.
a++
utilizza e quindi incrementa la variabile.
Se hai
a = 1;
e tu fai
System.out.println(a++); //You will see 1
//Now a is 2
System.out.println(++a); //You will see 3
codaddict spiega il tuo particolare frammento.
In entrambi i casi calcola prima il valore, ma in post-incremento mantiene il vecchio valore e dopo il calcolo lo restituisce
++ a
a ++
i = ++a + ++a + a++;
è
i = 6 + 7 + 7
In funzione : incremento da a a 6 (valore corrente 6) + incremento a a 7 (valore corrente 7). La somma è 13 ora aggiungila al valore corrente di a (= 7) e quindi incrementa a a 8. La somma è 20 e il valore di a dopo il completamento dell'assegnazione è 8.
i = a++ + ++a + ++a;
è
i = 5 + 7 + 8
In funzione : al valore iniziale di a è 5. Usalo nell'addizione e poi incrementalo a 6 (valore corrente 6). Incrementa a dal valore corrente 6 a 7 per ottenere un altro operando di +. La somma è 12 e il valore corrente di a è 7. Successivamente incrementare a da 7 a 8 (valore corrente = 8) e aggiungerlo alla somma precedente 12 per ottenere 20.
++a
incrementi a
prima di essere valutato.
a++
valuta a
e poi lo incrementa.
In relazione alla tua espressione data:
i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end
Le parentesi che ho usato sopra sono usate implicitamente da Java. Se guardi i termini in questo modo puoi facilmente vedere che sono entrambi uguali in quanto sono commutativi.
++ a è l'operatore di incremento del prefisso:
a ++ è un operatore di incremento postfisso:
Una volta che ricordi le regole, fai EZ per calcolare tutto!
Presumendo che intendessi
int a=5; int i;
i=++a + ++a + a++;
System.out.println(i);
a=5;
i=a++ + ++a + ++a;
System.out.println(i);
a=5;
a=++a + ++a + a++;
System.out.println(a);
Questo restituisce:
i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)
quindi i è 6 + 7 + 7 = 20 e quindi viene stampato 20.
i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)
quindi i è 5 + 7 + 8 = 20 e quindi 20 viene stampato di nuovo.
a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)
e dopo che tutto il lato destro è stato valutato (inclusa l'impostazione di a su 8), ALLORA a è impostato su 6 + 7 + 7 = 20 e quindi 20 viene stampato un'ultima volta.
quando a
è 5, allora a++
dà 5 all'espressione e a
poi incrementa , mentre ++a
incrementa a
prima di passare il numero all'espressione (che a
in questo caso dà 6 all'espressione).
Quindi calcoli
i = 6 + 7 + 7
i = 5 + 7 + 8
Credo tuttavia che se combini tutte le tue dichiarazioni e lo esegui in Java 8.1 otterrai una risposta diversa, almeno questo è quello che dice la mia esperienza.
Il codice funzionerà in questo modo:
int a=5,i;
i=++a + ++a + a++; /*a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8); i=20;*/
i=a++ + ++a + ++a; /*a = 5;
i=a++ + ++a + ++a; =>
i=8 + 10 + 11; (a=11); i=29;*/
a=++a + ++a + a++; /*a=5;
a=++a + ++a + a++; =>
a=12 + 13 + 13; a=38;*/
System.out.println(a); //output: 38
System.out.println(i); //output: 29
Pre-incremento significa che la variabile viene incrementata PRIMA di essere valutata nell'espressione. Post-incremento significa che la variabile viene incrementata DOPO essere stata valutata per essere utilizzata nell'espressione.
Pertanto, guarda attentamente e vedrai che tutte e tre le assegnazioni sono aritmeticamente equivalenti.
a=5; i=++a + ++a + a++;
è
i = 7 + 6 + 7
Lavorando: pre / post incremento ha associatività "da destra a sinistra", e pre ha la precedenza su post, quindi prima di tutto pre incremento sarà risolto come (++a + ++a) => 7 + 6
. quindi a=7
viene fornito per post increment => 7 + 6 + 7 =20
e a =8
.
a=5; i=a++ + ++a + ++a;
è
i=7 + 7 + 6
Lavorare: pre / post incremento ha associatività "da destra a sinistra", e pre ha la precedenza su post, quindi prima di tutto pre incremento sarà risolto come (++a + ++a) => 7 + 6
.quindi a=7
viene fornito a post increment => 7 + 7 + 6 =20
e a =8
.
Credo che tu stia eseguendo tutte queste istruzioni in modo diverso,
eseguendole insieme risulterà => 38, 29
int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated,
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)