Operator ternary di Jawa hanya mengevaluasi satu ekspresi sejak Java 7 - apakah itu berbeda di Java 1.6 dan yang lebih rendah?

109

Mempersiapkan ujian Oracle Certified Associate Java SE 8 Programmer 1, saya menemukan paragraf berikut tentang ekspresi terner di Panduan Studi resmi:

Evaluasi Ekspresi Ternary
Pada Java 7, hanya satu ekspresi kanan dari operator terner yang akan dievaluasi saat runtime. Dengan cara yang mirip dengan operator hubung singkat, jika salah satu dari dua ekspresi tangan kanan di operator terner melakukan efek samping, maka itu tidak dapat diterapkan pada waktu proses. Mari kita ilustrasikan prinsip ini dengan contoh berikut: [...]

Dikatakan bahwa hanya satu dari dua ekspresi yang dievaluasi, didemonstrasikan dengan contoh berikut:

int y = 1;
int z = 1;
int a = y < 10 ? y++ : z++;

Di sini, hanya ykenaikan, tetapi ztidak, seperti yang Anda harapkan.

Apa yang saya temukan adalah awal dari paragraf (ditandai dengan warna kuning) di mana dikatakan "As of Java 7, ...". Saya menguji kode yang sama dengan Java 1.6 dan saya tidak dapat menemukan perbedaan dalam perilakunya. Saya berharap Java 1.6 mengevaluasi kedua ekspresi hanya dari informasi yang diberikan dalam paragraf. Adakah yang tahu apa yang ingin mereka katakan dengan "As of Java 7, ..."?

Sunting: Untuk menghindari kebingungan: Itu intinya pada pertanyaan, Karena mereka menulis 'Pada Java 7', apakah ada sesuatu yang berubah tentang operator terner, ketika beralih dari Java 6 ke Java 7?

Mathias Bader
sumber
4
Mengapa Anda mengharapkan z juga ditingkatkan? Ini tidak masuk akal bagiku.
Jiří Kantor
15
Kedengarannya seperti buku yang ditulis dengan buruk, operator terner tidak berubah sejak dimulainya java, afaik
NimChimpsky
23
Membaca sebagian besar jawaban yang diposting sejauh ini, orang-orang tampaknya salah menafsirkan pertanyaan tersebut. Ini bukan "Mengapa kedua ekspresi tidak dievaluasi?", Melainkan "Mengapa buku ini tampaknya menyiratkan bahwa dulu berperilaku berbeda?"
BambooleanLogic
23
Sebenarnya, saya telah melihat "Pada tanggal / versi X" biasanya berarti "Kami memeriksa bahwa ini benar pada tanggal / dalam versi X tetapi kami tidak mengatakan apa-apa tentang versi sebelumnya." Saya menduga itu mungkin artinya di sini. (Meskipun menurut Anda akan cukup mudah untuk memeriksa versi Java yang lebih lama.) Bagaimanapun, itu lebih merupakan masalah bahasa Inggris daripada masalah pemrograman.
David Z
14
@DavidZ: Masalah bahasa Inggris adalah masalah pemrograman ketika mereka menghentikan Anda menyelesaikan pekerjaan Anda. Komentar yang tidak tepat ini membuat OP menghentikan apa yang dia lakukan dan membuang waktu menemukan bahwa TIDAK ADA YANG BERUBAH. Pemrograman adalah komunikasi, kepada compiler / interpreter dan kepada siapapun yang datang kemudian untuk menjaga kode Anda. Saya tidak dapat menghitung berapa kali saya telah membaca beberapa kode, dan harus berhenti karena sesuatu yang aneh yang / mungkin / telah ada hubungannya dengan masalah tersebut, hanya untuk mengetahui bahwa itu hanya "diutarakan" dengan buruk.
jmoreno

Jawaban:

92

Saya salah satu penulis buku ini. Meskipun saya tidak menulis kalimat tersebut, saya setuju bahwa maksudnya adalah "ini telah diuji pada Java 7". Saya akan membuat catatan untuk menghapusnya jika kita menulis edisi lain.

Untuk memperjelas, operator terner telah berperilaku dengan cara yang sama di Java 8, 7, 6, dll. Dan saya akan sangat terkejut jika berubah di masa mendatang.

Jeanne Boyarsky
sumber
116

Dari Java 6 JLS :

Pada waktu proses, ekspresi operan pertama dari ekspresi kondisional dievaluasi terlebih dahulu; jika perlu, konversi unboxing dilakukan pada hasilnya; nilai boolean yang dihasilkan kemudian digunakan untuk memilih ekspresi operan kedua atau ketiga:

  • Jika nilai operan pertama benar, maka ekspresi operan kedua dipilih.
  • Jika nilai operan pertama salah, maka ekspresi operan ketiga dipilih.

Ekspresi operan yang dipilih kemudian dievaluasi dan nilai yang dihasilkan dikonversi ke jenis ekspresi kondisional seperti yang ditentukan oleh aturan yang disebutkan di atas. Konversi ini mungkin termasuk konversi tinju (§5.1.7) atau unboxing. Ekspresi operan yang tidak dipilih tidak dievaluasi untuk evaluasi ekspresi kondisional tersebut.

Kata-kata serupa juga muncul di edisi JLS sejak 1.0 . Perilaku tidak berubah di Java 7; panduan belajarnya kurang bagus.

user2357112 mendukung Monica
sumber
2
Jadi jawabannya "Tidak ada perbedaan antara Java 7 dan sebelumnya, tentang operator terner", bukan?
Mathias Bader
5
Kelihatannya mantap. Saya menulis memo kepada penulis - menunggu jawaban mereka
Mathias Bader
Anda mungkin juga dapat menemukan URL yang membandingkan kode operator antar versi. Jika Anda paranoid / penasaran.
Steve Clay
7
Jumlah pertanyaan yang ditulis dengan buruk (atau benar-benar salah) dalam sertifikasi Oracle ini selalu mencengangkan lagi ..
Voo