Saya tidak yakin apakah ada item dalam Spesifikasi Bahasa Jawa yang menentukan pemuatan nilai variabel sebelumnya ...
Ada. Lain kali Anda tidak jelas apa spesifikasi mengatakan, silakan baca spesifikasi dan kemudian ajukan pertanyaan jika tidak jelas.
... sisi kanan (x = y)
yang, berdasarkan urutan yang ditunjukkan oleh tanda kurung, harus dihitung terlebih dahulu.
Pernyataan itu salah. Tanda kurung tidak menyiratkan urutan evaluasi . Di Jawa, urutan evaluasi dibiarkan ke kanan, terlepas dari tanda kurung. Tanda kurung menentukan di mana batas subekspresi berada, bukan urutan evaluasi.
Mengapa ekspresi pertama bernilai false, tetapi yang kedua bernilai true?
Aturan untuk ==
operator adalah: mengevaluasi sisi kiri untuk menghasilkan nilai, mengevaluasi sisi kanan untuk menghasilkan nilai, membandingkan nilai-nilai, perbandingannya adalah nilai ekspresi.
Dengan kata lain, arti expr1 == expr2
selalu sama seolah-olah Anda telah menulis temp1 = expr1; temp2 = expr2;
dan kemudian mengevaluasi temp1 == temp2
.
Aturan untuk =
operator dengan variabel lokal di sisi kiri adalah: mengevaluasi sisi kiri untuk menghasilkan variabel, mengevaluasi sisi kanan untuk menghasilkan nilai, melakukan penugasan, hasilnya adalah nilai yang ditugaskan.
Jadi kumpulkan:
x == (x = y)
Kami memiliki operator pembanding. Mengevaluasi sisi kiri untuk menghasilkan nilai - kami mendapatkan nilai saat ini x
. Mengevaluasi sisi kanan: itu adalah tugas jadi kami mengevaluasi sisi kiri untuk menghasilkan variabel - variabel x
- kami mengevaluasi sisi kanan - nilai saat ini y
- menetapkannya x
, dan hasilnya adalah nilai yang diberikan. Kami kemudian membandingkan nilai asli x
dengan nilai yang ditugaskan.
Anda bisa melakukannya (x = y) == x
sebagai latihan. Sekali lagi, ingat, semua aturan untuk mengevaluasi sisi kiri terjadi sebelum semua aturan mengevaluasi sisi kanan .
Saya berharap (x = y) dievaluasi terlebih dahulu, dan kemudian akan membandingkan x dengan dirinya sendiri (3) dan mengembalikan true.
Harapan Anda didasarkan pada seperangkat keyakinan yang salah tentang aturan Jawa. Semoga Anda sekarang memiliki keyakinan yang benar dan di masa depan akan mengharapkan hal-hal yang benar.
Pertanyaan ini berbeda dari "urutan evaluasi subekspresi dalam ekspresi Java"
Pernyataan ini salah. Pertanyaan itu benar-benar erat.
x jelas bukan 'subekspresi' di sini.
Pernyataan ini juga salah. Ini adalah subekspresi dua kali dalam setiap contoh.
Perlu dimuat untuk perbandingan daripada harus 'dievaluasi'.
Saya tidak tahu apa artinya ini.
Tampaknya Anda masih memiliki banyak kepercayaan salah. Saran saya adalah Anda membaca spesifikasi sampai keyakinan salah Anda digantikan oleh keyakinan sejati.
Pertanyaannya adalah khusus-Jawa dan ekspresi x == (x = y), tidak seperti konstruksi tidak praktis yang dibuat-buat yang biasanya dibuat untuk pertanyaan wawancara yang rumit, berasal dari proyek nyata.
Asal usul ungkapan tidak relevan dengan pertanyaan. Aturan untuk ekspresi semacam itu dijelaskan dengan jelas dalam spesifikasi; membacanya!
Itu seharusnya menjadi pengganti satu baris untuk idiom bandingkan-dan-ganti
Karena penggantian satu baris menyebabkan banyak kebingungan pada Anda, pembaca kode, saya akan menyarankan bahwa itu adalah pilihan yang buruk. Membuat kode lebih ringkas tetapi lebih sulit untuk dipahami bukanlah suatu kemenangan. Tidak mungkin membuat kode lebih cepat.
Kebetulan, C # telah membandingkan dan mengganti sebagai metode perpustakaan, yang dapat dimasukkan ke instruksi mesin. Saya percaya Java tidak memiliki metode seperti itu, karena tidak dapat diwakili dalam sistem tipe Java.