Qualcuno può spiegare questo il motivo per cui la sua accadendoin grado di fare questo incarico in java
int i=0;
i=i++;
i=i++;
i=i++;
System.out.println(i);
la stampa zero.
Qualcuno può spiegare questo il motivo per cui la sua accadendoin grado di fare questo incarico in java
int i=0;
i=i++;
i=i++;
i=i++;
System.out.println(i);
la stampa zero.
i++
è un postincremento (JLS 15.14.2). Incrementa i
, ma il risultato dell'espressione è il valore di i
prima dello l'incremento. Assegnando questo valore a i
in effetti, il valore di i
rimane invariato.
scomposizione in questo modo:
int i = 0;
int j = i++;
E 'facile capire perché j == 0
in questo caso. Ora, invece di j
, sostituiamo il lato sinistro con i
. Il valore del lato destro è ancora 0
, ed è per questo che ottieni lo i == 0
nel tuo snippet.
È destinato a fare questo:
int i = 0;
i++;
i++;
i++;
System.out.println(i);
i++
fa in realtà un compito, quindi se si aggiunge un =
basta confondere le cose. Questi altri bravi risponditori possono darti il nocciolo duro, alcuni dettagli mi sfuggono. :)
prima cosa è non si dovrebbe scrivere questo tipo di codice ....
Ma se consideriamo per il bene domande allora questo semplice: ha a che fare con il modo in cui l'operatore postfix "ritorni" il valore. Un postfix ha la precedenza sull'operatore di assegnazione, ma l'operatore postfisso dopo aver incrementato il valore di i restituisce il valore precedente di i. Quindi vengo nuovamente assegnato al suo valore precedente.
E ancora una volta non usare questo costrutto nel codice come il prossimo programmatore che vede questo verrà dopo di voi (con qualcosa di grande nelle sue mani) :)
Let I=++
, con un incremento, e A=i
, un incarico. Sono non commutativi: IA != AI
.
Sommario
IA = "first increase then assignment"
contro-esempio
$ javac Increment.java
$ java Increment
3
$ cat Increment.java
import java.util.*;
import java.io.*;
public class Increment {
public static void main(String[] args) {
int i=0;
i=++i;
i=++i;
i=++i;
System.out.println(i);
}
}
correlati