2010-03-03 7 views
57

Puoi spiegarmi l'output di questo codice Java?Come funzionano gli operatori di incremento post (i ++) e pre incremento (++ i) in 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

+1

7 + 7 + 6 = 20. _____ – kennytm

+3

Evita sempre le dichiarazioni ambigue :) –

+7

@Prasoon Saurav A differenza di C e C++, Java e C# hanno un ordine di valutazione strettamente definito, quindi queste affermazioni non sono ambigue. –

risposta

88

Questo aiuto?

a = 5; 
i=++a + ++a + a++; => 
i=6 + 7 + 7; (a=8) 

a = 5; 
i=a++ + ++a + ++a; => 
i=5 + 7 + 8; (a=8) 
+5

Sei sicuro di un == 9 nel secondo? –

+0

Hai ragione, non è 9. È 8. – kgiannakakis

+0

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

7

++a incrementi a prima della sua valutazione. a++ valuta a e quindi lo incrementa.

relativi alla vostra 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 

I parenteses che ho usato in precedenza sono implicitamente utilizzati da Java. Se osservi i termini in questo modo puoi facilmente vedere che sono entrambi gli stessi come commutativi.

+1

quindi il suo codice dice: i = 6 + 7 + 7; i = 5 + 7 + 8 – user181750

+1

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

15
i = ++a + ++a + a++; 

è

i = 6 + 7 + 7 

lavoro: incrementare un 6 (valore corrente 6) + incrementare un a 7 (valore corrente 7). Somma è 13 aggiungervi alla valore corrente di un (= 7) e quindi incrementare un a 8. somma è 20 e il valore di una dopo l'assegnazione completa è 8.

i = a++ + ++a + ++a; 

è

i = 5 + 7 + 8 

Lavoro: Al valore iniziale di a è 5. Utilizzarlo nell'addizione e quindi incrementarlo a 6 (valore corrente 6). Incrementa a dal valore corrente da 6 a 7 per ottenere un altro operando di +. La somma è 12 e il valore corrente di a è 7. Avanti incrementa da 7 a 8 (valore corrente = 8) e aggiungilo alla somma precedente 12 per ottenere 20.

+0

queste istruzioni funzionano da destra a sinistra o da sinistra a destra? – Abhijeet

1

quando a è 5, quindi a++ dà un 5 all'espressione e incrementi a successivamente, mentre ++a incrementi a prima di passare il numero all'espressione (che dà a 6 all'espressione in questo caso).

Così si calcola

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

++a incrementi e poi utilizza la variabile.
a++ utilizza e quindi incrementa la variabile.

Se hai

a = 1; 

e fate

System.out.println(a++); //You will see 1 

//Now a is 2 

System.out.println(++a); //You will see 3 

@codaddict spiega il vostro particolare snippet.

4

Nell'esempio di cui 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 
0
a=5; i=++a + ++a + a++; 

è

i = 7 + 6 + 7 

di lavoro: pre/post incremento ha "da destra a sinistra" associatività, e pre ha la precedenza sul posto, quindi prima di tutto il pre-incremento sarà risolto come (++a + ++a) => 7 + 6. quindi a=7 viene fornito per registrare incremento =>7 + 6 + 7 =20 e a =8.

a=5; i=a++ + ++a + ++a; 

è

i=7 + 7 + 6 

di lavoro: pre/post incremento ha "da destra a sinistra" associatività, e pre ha la precedenza sul posto, quindi prima di tutto incremento pre sarà risolvere come (++a + ++a) => 7 + 6 .then a=7 viene fornito per postare incremento =>7 + 7 + 6 =20 e a =8.

0

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 
1

credo se si combinano tutte le sue dichiarazioni ed eseguirlo in Java 8.1 si otterrà una risposta diversa, almeno questo è quello che dice la mia esperienza.

Il codice funziona come questo:

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 
2

++ a è prefisso operatore minimo:

  • il risultato viene calcolato e memorizzato prima,
  • viene utilizzato il variabile.

un ++ è operatore postfisso minimo:

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

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

1

presumendo che si intende

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) 

così mi è 6 + 7 + 7 = 20 e così 20 sarà stampato.

i = (5, a is now 6) + (7, a is now 8) + (8, a is now 9) 

così i è 5 + 7 + 8 = 20 e quindi 20 viene stampato nuovamente.

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8) 

e dopo tutto il lato destro viene valutata (compresa l'impostazione di un a 8) allora A è impostato 6 + 7 + 7 = 20 e così 20 viene stampata l'ultima volta.

10

In entrambi i casi prima calcola valore, ma in post-incremento che tiene vecchio valore e ritorna dopo calcolo è

++ un

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

una temperatura ++

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

Risposta più chiara –

0

Credo che si sta eseguendo tutte queste dichiarazioni in modo diverso
esecuzione insieme si tradurrà => 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)