Java Dil Belirtimi'nde bir değişkenin önceki değerini yüklemeyi dikte eden bir öğe olup olmadığından emin değilim ...
Var. Eğer şartname ne diyor belirsiz dahaki sefere özellikleri okumak ve lütfen daha sonra hala belli olmadığını soru sormak.
... önce (x = y)
köşeli parantezlerin ima ettiği sıra ile hesaplanması gereken sağ taraf .
Bu ifade yanlıştır. Parantezler bir değerlendirme sırası anlamına gelmez . Java'da değerlendirme sırası parantezden bağımsız olarak sağdan sola doğrudur. Parantezler, değerlendirme sırasını değil, alt ifade sınırlarının nerede olduğunu belirler.
İlk ifade neden yanlış olarak değerlendirilir, ancak ikinci ifade doğru olarak değerlendirilir?
==
İşleç kuralı : bir değeri üretmek için sol tarafı değerlendirmek, bir değeri üretmek için sağ tarafı değerlendirmek, değerleri karşılaştırmak, karşılaştırma ifadenin değeridir.
Diğer bir deyişle, anlamı expr1 == expr2
her zaman yazmış temp1 = expr1; temp2 = expr2;
ve değerlendirmiş gibi aynıdır temp1 == temp2
.
=
Sol tarafta yerel bir değişkeni olan işleç için kural şudur: bir değişken üretmek için sol tarafı değerlendirin, bir değer üretmek için sağ tarafı değerlendirin, atamayı gerçekleştirin, sonuç atanan değerdir.
Öyleyse bir araya getirin:
x == (x = y)
Bir karşılaştırma operatörümüz var. Bir değeri üretmek için sol tarafı değerlendirin - şu anki değerini alırız x
. Sağ tarafı değerlendirin: bu bir atamadır, böylece bir değişkeni üretmek için sol tarafı değerlendiririz - değişken x
- sağ tarafı değerlendiririz - şu anki değerini y
- atar x
ve sonuç atanan değerdir. Ardından, orijinal değerini x
atanan değerle karşılaştırırız .
(x = y) == x
Bir egzersiz olarak yapabilirsiniz . Yine unutmayın, sol tarafı değerlendirmek için tüm kurallar, sağ tarafı değerlendirmek için tüm kurallardan önce gerçekleşir .
Önce (x = y) değerlendirilmesini beklerdim, sonra x'i kendisi (3) ile karşılaştırır ve true değerini döndürürdü.
Beklentiniz, Java kuralları hakkında bir dizi yanlış inanca dayanmaktadır. Umarım şimdi doğru inançlara sahipsiniz ve gelecekte gerçek şeyler bekleyeceksiniz.
Bu soru "Java ifadesinde alt ifadelerin değerlendirme sırası" ndan farklıdır.
Bu ifade yanlıştır. Bu soru tamamen almanca.
x kesinlikle burada bir 'alt ifade' değildir.
Bu ifade de yanlıştır. Her örnekte iki kez bir alt ifadedir .
Karşılaştırma için 'değerlendirilmek' yerine yüklenmesi gerekir.
Bunun ne anlama geldiğini bilmiyorum.
Görünüşe göre hala birçok yanlış inancınız var. Benim tavsiyem, yanlış inançlarınız yerine gerçek inançların yerini alana kadar spesifikasyonu okumanızdır.
Soru Java'ya özgüdür ve zor röportaj soruları için yaygın olarak hazırlanmış uzak getirilmiş pratik olmayan yapıların aksine x == (x = y) ifadesi gerçek bir projeden geldi.
İfadenin yaygınlığı soru ile ilgili değildir. Bu tür ifadelere ilişkin kurallar tarifnamede açıkça tanımlanmıştır; oku onu!
Karşılaştırma ve değiştirme deyimi için tek satırlık bir yedek olması gerekiyordu
Bu tek satırlık değiştirme, kodun okuyucusunda büyük bir karışıklığa neden olduğundan, bunun kötü bir seçim olduğunu öneririm. Kodu daha kısa ve anlaşılması zor hale getirmek bir kazanç değildir. Kodu daha hızlı hale getirme olasılığı düşüktür.
Bu arada, C # etti karşılaştırmak ve yerine bir kütüphane yöntemi olarak yapabilirsiniz bir makine talimat aşağı jitted edilecek. Java tür sisteminde temsil edilemediğinden Java'nın böyle bir yöntemi olmadığına inanıyorum.