Come funzionano gli operatori post increment (i ++) e pre increment (++ i) in Java?


99

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


9
Evita sempre affermazioni ambigue :)
Prasoon Saurav

9
@Prasoon Saurav A differenza di C e C ++, Java e C # hanno un ordine di valutazione rigorosamente definito, quindi queste istruzioni non sono ambigue.
Pete Kirkham

12
Lo so, ma queste affermazioni non sono (non possono essere) usate per scopi pratici, quindi bisogna evitarlo.
Prasoon Saurav


4
@PeteKirkham Sono passati più di sei anni, ma voglio comunque sottolineare che "ambiguo", in questa situazione, è ambiguo - potrebbe significare "il compilatore non sa cosa mettere", oppure potrebbe significare "Il programmatore non ha idea di cosa significhi ".
Finanzia la causa di Monica il

Risposte:


150

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 ++aincrementa 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.


5
Sei sicuro di un == 9 nel secondo?
Pete Kirkham

1
i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) poiché l'incremento di post ha la precedenza più alta, viene eseguito prima a ++?
rsirs

2
esempio complicato a qualcosa che è facile da spiegare.
oznus

Questa risposta è la stessa per c # e c ++?
workoverflow

Perché a, bec sono uguali a 2 qui? int a = 1; int b = a++; int c = ++b;Mi aspettavo che b fosse 1 poiché è un incremento di post.
Dennis

202

++aincrementa 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.


62

In entrambi i casi calcola prima il valore, ma in post-incremento mantiene il vecchio valore e dopo il calcolo lo restituisce

++ a

  1. a = a + 1;
  2. return a;

a ++

  1. temp = a;
  2. a = a + 1;
  3. temp. di ritorno;

8
Risposta più
chiara

2
questo è stato quello che mi ha fatto capire chiaramente .. grazie.
rematnarab

22
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.


queste affermazioni funzionano da destra a sinistra o da sinistra a destra?
Abhijeet

10

++aincrementi aprima di essere valutato. a++valuta ae 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.


1
@ KlasLindbäck commutativa significa che puoi scambiare entrambe le espressioni e ottenere comunque lo stesso risultato. Quindi a ++ + ++ a == ++ a + a ++ (5 + 7 == 6 + 6; a == 7 alla fine).
Aurril

8

Nell'esempio sopra

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29

4

++ a è l'operatore di incremento del prefisso:

  • il risultato viene calcolato e memorizzato per primo,
  • quindi viene utilizzata la variabile.

a ++ è un operatore di incremento postfisso:

  • la variabile viene utilizzata per prima,
  • quindi il risultato viene calcolato e memorizzato.

Una volta che ricordi le regole, fai EZ per calcolare tutto!


4

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.


3

quando aè 5, allora a++dà 5 all'espressione e apoi incrementa , mentre ++aincrementa aprima di passare il numero all'espressione (che ain questo caso dà 6 all'espressione).

Quindi calcoli

i = 6 + 7 + 7
i = 5 + 7 + 8

3

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

3

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.


2

pre-incremento e post incremento sono equivalenti se non in un'espressione

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10

0
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=7viene fornito per post increment => 7 + 6 + 7 =20e 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=7viene fornito a post increment => 7 + 7 + 6 =20e a =8.


0

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.