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.