Kod Javowy:
public class Main {
public static void main(String[] args) {
int i = 0;
i = i++;
i++;
i = i + 1;
System.out.println(i);
System.out.println(i++);
System.out.println(++i);
}
}
Dezasemblacja + komentarze:
piotrek@p5q-pro:~/NetBeansProjects/IdeoneJava/build/classes$ javap -c Main
Compiled from "Main.java"
public class Main extends java.lang.Object{
public Main();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 - załaduj zero
1: istore_1 - zapisz w pierwszej zmiennej lokalnej
2: iload_1 - załaduj pierwszą zmienną lokalną
3: iinc 1, 1 - zwiększ pierwszą zmienną lokalną o jeden
6: istore_1 - zapisz pierwszą zmienną lokalną
7: iinc 1, 1 - zwiększa pierwszą zmienną lokalną o jeden
10: iload_1 - załaduj pierwszą zmienną lokalną
11: iconst_1 - załaduj jedynkę
12: iadd - dodaj wartości
13: istore_1 - zapisz pierwszą zmienną lokalną
14: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
17: iload_1 - załaduj pierwszą zmienną lokalną
18: invokevirtual #3; //Method java/io/PrintStream.println:(I)V - wypisz tą zmienną
21: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
24: iload_1 - załaduj pierwszą zmienną lokalną
25: iinc 1, 1 - zwiększ pierwszą zmienną lokalną o jeden
28: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
31: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
34: iinc 1, 1 - zwiększ pierwszą zmienną lokalną o jeden
37: iload_1 - załaduj pierwszą zmienną lokalną
38: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
41: return
}
Podstawowy myk jest taki, że maszyna Javy to maszyna stosowa. A więc jak wrzucimy zmienną na stos, a potem ją zmienimy, to wartość na stosie nie będzie odzwierciedlać aktualnego stanu zmiennej.