2014-07-03 10 views
8

assegnazione Sono confuso su post ++ e operatore di pre ++, ad esempio, nel seguente codiceincremento Java e operatore di

int x = 10; 
x = x++; 

sysout(x); 

stamperà 10?

Esso stampa 10, ma mi aspettavo che dovrebbe stampare 11

ma quando lo faccio

x = ++x; instead of x = x++; 

verrà stampata undici come mi aspettavo, quindi perché fa x = x ++; non cambia il valore di x?

+3

A causa di questo tipo di confusione, davvero non dovrebbe fare questo nel codice reale. –

+3

Invece di 'x = x ++' ==> 'x ++' – donfuxx

+0

Votazione per riaprire: la domanda duplicata riguarda una differenza specifica tra pre e post-incremento. Pur comprendendo che la differenza potrebbe aiutare a rispondere a questa domanda, non è un duplicato esatto. – dasblinkenlight

risposta

8

No, la stampa di 10 è corretta. La chiave per comprendere il motivo alla base del risultato è la differenza tra le assegnazioni composte prima dell'incremento ++x e post-incremento x++. Quando si utilizza il pre-incremento, il valore dell'espressione viene acquisito dopo aver eseguito l'incremento. Quando si utilizza il post-incremento, tuttavia, il valore dell'espressione viene preso prima dell'incremento e memorizzato per l'utilizzo futuro, dopo che il risultato dell'incremento viene riscritto nella variabile.

Ecco la sequenza di eventi che porta a ciò che si vede:

  • x viene assegnato 10
  • A causa della ++ in posizione di post-incremento, il valore corrente di x (cioè 10) viene memorizzato per uso successivo
  • Il nuovo valore di 11 viene memorizzato in x
  • Il valore temporaneo di 10 viene memorizzato di nuovo in x, scrivendo sopra 11 che è stato memorizzato lì.
0

non ho trovato un riferimento nel JLS, in modo da questa risposta si basa sulla speculazione che si è non invocando un comportamento indefinito, perché questo è Java.

x = x++; // Assign the old value of `x` to x, before increment. 
x = ++x; // Assign the new value of `x` to x, after increment. 

Questo è basato sulla definizione di operatori postfisso e prefisso.

-1

Quando si esegue questa operazione:

x = x++; 

In realtà viene tradotto in "Assegna 'x' a 'x' e quindi incrementare 'x' per uno".

considerando in questo caso:

x = ++x; 

Essa si traduce in "Incremento 'x' per uno, quindi assegnare a 'x'".

+0

Sembra che sia il caso, rimosso il discorso di precedenza. – TheStack

0

Citando The Java tutorials - Assignment, Arithmetic, and Unary Operators: operatori

L'incremento/decremento possono essere applicati prima (prefisso) o dopo (suffisso) l'operando. Il codice result++; e ++result; terminano entrambi con un incremento del risultato di uno.L'unica differenza è che la versione del prefisso (++result) restituisce il valore incrementato, mentre la versione postfix (result++) restituisce il valore originale. Se stai semplicemente eseguendo un semplice incremento/decremento, non importa quale versione scegli. Ma se si utilizza questo operatore in parte di un'espressione più ampia, quella che si sceglie può fare una differenza significativa.

1

Messaggio Incremento (n ++): In primo luogo eseguire l'istruzione quindi aumentare il valore di uno.

Preincremento (++ n): Innanzitutto aumentare il valore di uno quindi eseguire l'istruzione.

Esempio:

class IncrementTest{ 
    public static void main(String[] args){ 

     System.out.println("***Post increment test***"); 
     int n = 10; 
     System.out.println(n);  // output 10 
     System.out.println(n++); // output 10 
     System.out.println(n);  // output 11 

     System.out.println("***Pre increment test***"); 
     int m = 10; 
     System.out.println(m);  // output 10 
     System.out.println(++m); // output 11 
     System.out.println(m);  // output 11 
    } 
} 
Problemi correlati