Secara umum diyakini bahwa pra-posisi ++ pertama menambahkan nilai variabel ke 1, dan kemudian menggunakan nilai setelah menambahkan 1 untuk berpartisipasi dalam operasi; Sementara pasca-posisi ++ pertama kali menggunakan nilai untuk berpartisipasi dalam operasi, dan kemudian menambahkan nilainya ke 1.
Mari kita lihat contoh pertama:
tes paket; kelas publik plus_test01 {public static void main (string [] args) {int i = 100; i = i ++; System.out.println (i); }}Tebak apa hasilnya?
Mari kita lihat yang kedua:
tes paket; kelas publik plus_test02 {public static void main (string [] args) {int k = 100; while (true) {if (k ++> 100) {// system.out.println (k); merusak; } System.out.println (k); }}}Tebak apa hasilnya?
Bahkan, apakah itu pra-++ atau post-++, nilai variabel pertama kali meningkat 1 sebelum terus menghitung. Perbedaan nyata antara keduanya adalah: pre-++ menambahkan nilai variabel dengan 1 dan menggunakan nilai tambah untuk melakukan perhitungan, sedangkan pos-++ pertama-tama menetapkan variabel ke variabel sementara, kemudian menambahkan 1 ke nilai variabel, dan kemudian menggunakan variabel sementara untuk melakukan perhitungan.
Untuk cuplikan kode berikut (awalan ++):
int i = 1;
int j = ++ i*5;
Faktanya, kalimat kedua setara dengan:
i+= 1; // tambahkan i ke 1
j = i*5; // Hitung nilai setelah menambahkan 1 dengan itu, hasilnya adalah: 10
Dan untuk cuplikan kode berikut (POST-++):
int i = 1;
int j = i ++*5;
Kalimat kedua setara dengan:
int temp = i; // Tetapkan I ke variabel sementara
i+= 1; // tambahkan i ke 1
j = temp*5; // Hitung variabel sementara dengannya, hasilnya adalah: 5
Untuk contoh pertama, itu setara dengan:
int temp = i;
i+= 1;
i = temp; //
Jadi hasilnya harus tidak berubah, yaitu 100.
Kode perakitan untuk contoh pertama adalah:
public static void main (java.lang.string []); deskriptor: ([ljava/lang/string;) v Bendera: acc_public, acc_static Code: stack = 2, penduduk setempat = 2, args_size = 1 0: bipush 100 2: iStore_1 3: iload_1 4: iinc 1, 1 // yang kedua di var lokal ditambah 1 7: ISTORE_1/IINC 1, java/lang/system.out: ljava/io/printstream; 11: iload_1 // Parameter yang dimuat adalah yang kedua di tumpukan, yaitu masih 100 12: Invokevirtual #22 // Metode Java/IO/printStream.println: (i) v 15: Return
Untuk contoh kedua, sebenarnya tidak sulit, tetapi hasilnya adalah 101. Perhatikan prosesnya dan Anda tidak dapat membuat kesalahan seperti itu di masa depan. (Prosesnya adalah: Pertama bandingkan temp = i, temp> 100, jelas tidak berlaku. Lewati I+= 1 dengan kalimat Syso, tentu saja, cetak 101, loop lagi, dan ada juga Temp = I, Temp> 100, kali ini benar, dan kemudian saya+= 1, melompat keluar dari loop secara langsung, dan pernyataan di saat ini tidak akan dieksekusi).
Kompilasi contoh kedua (hanya metode utama yang dipilih):
public static void main (java.lang.string []); deskriptor: ([ljava/lang/string;) v Bendera: acc_public, code acc_static: stack = 2, penduduk setempat = 2, args_size = 1 0: bipush 100 // 100 dorong tumpukan 2: iStore_1 // simpan ke var lokal kedua (var lokal pertama adalah metode parameter 3: iload_1 // Posisi 2 dari var lokal (variabel lokal meningkat, hasilnya masih dalam var lokal, 1 teratas dari tumpukan operan tidak akan berubah) 7: bipush 100 // 100 dorong tumpukan 9: if_icmple 15 // Bandingkan dua nilai integer int di bagian atas 12: jika 25 /yang pertama /yang pertama atau sama dengan atau sama dengan yang kedua atau sama dengan yang kedua, kemudian lompat ke lini 15: IDE LOUND 25 /jika 25 LINE /ISE TO 25 LINOD, IDE LINE, IDE LINE, IDE LINE, IDE LINE, IDE LINED, IDE LINED DUA LINED, IDE LINED DUA LINED, IDE LINED DUA LINED, IDE LINED DUA LINED. Operand Stack Top 2) 15: GetStatic #2 // Field Java/Lang/System.out: ljava/io/printStream; 18: iload_1 // // Muat dari var lokal pertama 19: Invokevirtual #3 // metode java/io/printStream.println: (i) v // Panggil metode ini 22: goto 3 // lompat kembali ke 3 lagi, loop lagi 25: return // outs
Contoh ketiga:
tes paket; kelas publik plus_test03 {static int proplus () {int i = 55; int j = ++ i; mengembalikan j; // 56} static int postplus () {int i = 55; int j = i ++; mengembalikan j; // 55} public static void main (string [] args) {System.out.println (proplus ()); // 56 System.out.println (postplus ()); // 55}}Kompilasi contoh ketiga:
statis int proplus (); deskriptor: () I Flags: Acc_static Code: Stack = 1, penduduk setempat = 2, args_size = 0 0: Bipush 55 // 55 Stack 2: iStore_0 // Menyimpan bagian atas stack int ke var lokal 3: iinc 0, 1 // var lokal pertama plus 1: iload_0 // load lokal: lug LOK LOKAL 3: 1 // ISTORE PLOCAL VAR PLUS 1: ILOAD_0 // LOAD LOKAL 3: IICK 0, 1 // ISE LOCAL VAR PLUS 1: ILOAD_0 / /LOAD LOKAL DARI OLA DARI PLOK 7 /ISOOD 7 /ISE TO VAR / /ISE First VAR PLUS 1: ILOAD_0 // LOAD LOKAL DARI OLA DARI PLOK AREAD 0: // Bagian atas tumpukan adalah var lokal kedua 9: ireturnstatic int postplus (); deskriptor: () I Flags: Acc_static Code: Stack = 1, penduduk setempat = 2, args_size = 0 0: bipush 55 2: iStore_0 3: iload_0 // muat ke stack 4: iinc 0, 1 // var lokal pertama plus 1 7: iStore_1 8: Load_1 9: Ireturn
Dapat dilihat bahwa perbedaan antara ++ depan dan bagian belakang ++ adalah bagian biru di atas (// var lokal pertama plus 1), yang sebaliknya. Untuk pendahulu, angka di VAR lokal akan ditambahkan 1 dan kemudian dimuat ke dalam tumpukan, sedangkan yang terakhir akan dimuat dari tumpukan VAR lokal ke tumpukan, dan kemudian VAR lokal akan ditambahkan 1, yang setara dengan meninggalkan cadangan.
Kesimpulan:
satu. Pra-posisi dan pasca-posisi ++ keduanya menambahkan 1 ke nilai variabel terlebih dahulu, alih-alih menambahkan 1 ke pra-posisi ++ dan kemudian menghitung, sedangkan post-position ++ terlebih dahulu dan kemudian menghitung.
dua. Dari yang secara terprogram, posting-++ pertama memberikan variabel ke variabel sementara, kemudian menambahkan nilai variabel dengan 1, dan kemudian menggunakan variabel sementara untuk berpartisipasi dalam operasi.
tiga. Dari sudut pandang instruksi, nilai variabel didorong ke tumpukan sebelum menjalankan instruksi bernilai tambah (iinc). Setelah menjalankan instruksi bernilai tambah, nilai yang didorong ke tumpukan digunakan.
Saya berharap bahwa melalui artikel ini, saya akan benar-benar memahami perbedaan antara operasi ++ pra-posisi dan post-position ++. Terima kasih atas dukungan Anda untuk situs ini!