Java'daki üçlü operatör yalnızca Java 7'den beri tek bir ifadeyi değerlendiriyor - Java 1.6 ve önceki sürümlerde bu farklı mıydı?


109

Oracle Certified Associate Java SE 8 Programmer 1 sınavına hazırlanırken, resmi Çalışma Kılavuzunda üçlü ifade ile ilgili aşağıdaki paragrafla karşılaştım:

Üçlü İfade Değerlendirmesi
Java 7'den itibaren, üçlü operatörün sağ el ifadelerinden yalnızca biri çalışma zamanında değerlendirilecektir. Kısa devre operatörlerine benzer bir şekilde, üçlü bir operatördeki iki sağ el ifadesinden biri bir yan etki gerçekleştirirse, çalışma zamanında uygulanmayabilir. Bu prensibi aşağıdaki örnekle açıklayalım: [...]

Aşağıdaki örnekle gösterildiği gibi, iki ifadeden yalnızca birinin değerlendirildiğini söylüyor:

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

Burada, beklediğiniz gibi yalnızca yartışlar, ancak zartmaz.

Karşılaştığım şey, "Java 7'den itibaren ..." yazan paragrafın başlangıcı (sarı ile işaretlenmiş). Aynı kodu Java 1.6 ile test ettim ve davranışta bir fark bulamıyorum. Java 1.6'nın her iki ifadeyi de sadece paragrafta verilen bilgilerden değerlendirmesini bekliyordum. "Java 7'den itibaren ..." ile ne söylemek istediği hakkında bir fikri olan var mı?

Düzenleme: Karışıklığı önlemek için: 'Java 7'den itibaren' yazdıkları için Java 6'dan Java 7'ye geçerken üçlü operatörle ilgili değişen herhangi bir şey oldu mu?


4
Neden z'nin de artmasını bekliyorsunuz? Bu bana hiç mantıklı gelmiyor.
Jiří Kantor

15
Bir kötü yazılmış bir kitap gibi sesler, üçlü operatörler afaik, java beginging beri değişmemiştir
NimChimpsky

23
Şimdiye kadar gönderilen cevapların çoğunu okurken, insanlar soruyu yanlış yorumluyor gibi görünüyor. "Neden her iki ifade de değerlendirilmiyor?" Değil, "Neden bu kitap görünüşte daha önce farklı davrandığını ima ediyor?"
BambooleanLogic

23
Aslında, "X tarihi itibariyle / sürüm itibariyle" nin "Bunun doğru olduğunu X sürümünde / sürümünde kontrol ettik ama önceki sürümler hakkında hiçbir şey söylemiyoruz" anlamına geldiğini görmüştüm. Sanırım buradaki anlam bu olabilir. (Yine de Java'nın önceki sürümlerini kontrol etmenin yeterince kolay olacağını düşünseniz de) Her neyse, bu bir programlama sorunundan çok bir İngilizce sorunu.
David Z

14
@DavidZ: İngilizce sorunları, işinizi yapmanıza engel olan programlama sorunlarıdır. Bu kötü ifade edilmiş yorum, OP'nin yaptığı şeyi durdurmasına ve HİÇBİR ŞEYİN DEĞİŞMEDİĞİNİ keşfederek zaman kaybetmesine neden oldu. Programlama, derleyiciye / yorumlayıcıya ve kodunuzu korumak için daha sonra gelen kişiyle iletişimdir. Bazı kodları okuduğum ve sorunla ilgisi olan / olabileceği / yapmış olabileceği garip bir şey yüzünden durmak zorunda kaldığım zamanları sayamam, sadece kötü bir şekilde "ifade edildiğini" bulmak için.
jmoreno

Yanıtlar:


92

Bunun geldiği kitabın yazarlarından biriyim. Bu cümleyi yazmasam da, niyetin "bu Java 7'de test edildi" olduğunu kabul ediyorum. Başka bir baskı yazarsak, bunu kaldırmak için bir not alacağım.

Açıkçası, üçlü operatör Java 8, 7, 6, vb .'de aynı şekilde davranmıştır. Gelecekte değişse çok şaşırırdım.


116

Gönderen Java 6 JLS :

Çalışma zamanında, koşullu ifadenin ilk işlenen ifadesi önce değerlendirilir; gerekirse, sonuç üzerinde kutudan çıkarma dönüşümü gerçekleştirilir; elde edilen boole değeri daha sonra ikinci veya üçüncü işlenen ifadesini seçmek için kullanılır:

  • İlk işlenenin değeri doğruysa, ikinci işlenen ifadesi seçilir.
  • İlk işlenenin değeri yanlışsa, üçüncü işlenen ifadesi seçilir.

Seçilen işlenen ifadesi daha sonra değerlendirilir ve elde edilen değer, yukarıda belirtilen kurallarla belirlendiği gibi koşullu ifadenin türüne dönüştürülür. Bu dönüştürme, kutulama (§5.1.7) veya kutudan çıkarma dönüştürme içerebilir. Seçilmeyen işlenen ifadesi, koşullu ifadenin söz konusu özel değerlendirmesi için değerlendirilmez.

Benzer ifadeler, 1.0 sürümüne giden JLS sürümlerinde de görülmektedir . Davranış Java 7'de değişmedi; çalışma kılavuzu kötü yazılmış.


2
Öyleyse cevap "Üç terimli işleçle ilgili olarak Java 7 ve öncesi arasında bir fark yok", değil mi?
Mathias Bader

5
Mantıklı gibi. Yazarlara bir not yazdım - cevabını dört gözle bekliyorum
Mathias Bader

Muhtemelen operatörün kodunu sürümler arasında karşılaştıran bir URL de bulabilirsiniz. Paranoyak / meraklıysanız.
Steve Clay

7
Bu Oracle sertifikalarındaki kötü yazılmış (veya tamamen yanlış) soruların sayısı her seferinde şaşırtıcıdır ..
Voo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.