Kode terlihat seperti ini:
public class testplusplus {public static void main (string [] args) {int k = addafterreturn (10); System.out.println (k); // output 10 int k1 = addBeforereturn (10); System.out.println (K1); // output 11} public static int addBeforereturn (int i) {return ++ i; } public static int addafterreturn (int i) {return i ++; }}Dari level bytecode,
Bytecode dari addafterreturn adalah sebagai berikut:
0: iload_01: iinc 0, 14: ireturn
Sederhana, ILoad_0 berarti menempatkan nilai elemen yang diindeks ke 0 di tabel variabel lokal ke bagian atas tumpukan. Oleh karena itu, nilai yang saya lewati ditempatkan di bagian atas tumpukan, dan iinc 0,1 berarti menempatkan tabel variabel lokal
Elemen dengan indeks 0 ditambahkan ke 1, dan akhirnya IRETURN menempatkan nilai int di bagian atas tumpukan ke dalam bingkai tumpukan penelepon. (Tumpukan di sini adalah tumpukan operan)
Oleh karena itu, iinc 0 dan 1 tidak benar -benar mempengaruhi nilai yang dikembalikan, jadi pengembaliannya masih 10.
Demikian pula, addBeforereturn bytecode adalah sebagai berikut:
0: iinc 0, 13: iload_04: ireturn
Saya akan menyerahkannya kepada semua orang untuk analisis mereka sendiri. Bahkan, jelas bahwa ini bertambah pertama dan kemudian memasukkannya ke dalam tumpukan. Jadi nilai yang dikembalikan sebenarnya bertambah.
Sekarang mari kita lakukan pertanyaan wawancara yang telah saya perbaiki sendiri.
kelas publik testplusplus2 {static {x = 5; int y = 10; } static int x, y; public static void main (string args []) {x--; mymethod (); System.out.println (x+y+++ x); } public static void mymethod () {y = x +++++ x; }}Apakah Anda tahu jawabannya? Jalankan, jawaban yang benar adalah 23.
Jika Anda benar -benar memahami hal di atas, pertanyaan ini juga sangat sederhana. Pertama -tama, Anda tahu nilai -nilai X dan Y sebelum mengeksekusi Main. Ini melibatkan mekanisme pemuatan kelas. Tahap persiapan pemuatan kelas akan menetapkan variabel statis ke nilai nol jenis ini. Jika int adalah int, itu sesuai dengan 0. Pada tahap inisialisasi kelas, blok statis dan perilaku penugasan variabel statis di kelas dikumpulkan sesuai dengan urutan kode untuk menghasilkan metode. Oleh karena itu, dalam tes ini, x = 5, y = 0;
Terus analisis, x--' ,所以x = 4,y = 0, myMethod 中y = x++ + ++x;
X ++ tidak akan menambahkan 1 sebelum melaksanakan operasi penambahan berikutnya, seperti halnya pengembalian i ++ hanya setelah kembali (Anda dapat memahami pengembalian sebagai operasi tumpukan iload di atas, bukan instruksi iretrun), jadi penambahan pertama adalah 4, tetapi harus dicatat di sini bahwa sebelum mengeksekusi ++ x, penambahan telah mengambil efek pada X yang sebenarnya, yaitu x sudah 5, jadi.
Maka itu sangat sederhana x+y +++ x adalah 6+10+7 adalah 23. Untungnya, jika Anda dapat memahami bytecode, Anda dapat menerjemahkan kode bytecode kode dan menggunakan bytecode untuk memverifikasi, dan Anda juga dapat menemukan hasil tersebut.
Mari kita lihat contoh lain, yang disediakan oleh orang -orang besar dalam grup. Saya pikir itu juga sangat mendasar.
public static int plus (int i) {coba {++ i; System.out.println ("coba"); return i ++; } akhirnya {System.out.println ("akhirnya"); i ++; // kembalikan i; }} public static void main (string [] args) {System.out.println (test1.plus (5));}Bisakah Anda memikirkan berapa output akhir? Jika Anda menghapus komentar, inilah mengapa Anda tidak kembali di blok akhirnya. Karena tidak peduli apakah itu benar atau salah, nilai tertentu dapat selalu dikembalikan.
Meringkaskan
Di atas adalah penjelasan terperinci tentang I ++ dan ++ I dalam pertanyaan wawancara Java yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!