SORU
23 Temmuz 2011, CUMARTESİ


Ne Java değerlendirme düzeni kurallarına?

Bazı Java metin okuma ve aşağıdaki kodu var:

int[] a = {4,4};
int b = 1;
a[b] = b = 0;

Metin, yazar, net bir açıklamada bulunmadı ve son satırın etkisi: a[1] = 0;

Anlıyorum o kadar emin değilim. nasıl bir değerlendirme oldu mu?

CEVAP
23 Temmuz 2011, CUMARTESİ


Kabul cevabı -- bu öncelik ve highed upvoted cevap olduğunu belirterek, bu birleşme bir arada olduğunu belirten ve öncelik -- her ikisi de yanlış. (Bu cevaplar, hem de silinir). Neyse ki bir öğretilebilir an hediyelerden bir şekilde yanılıyorlar!

İnsanlar bunu hep yanlış anlıyor çünkü şunu çok açık bir şekilde izin:

Taşıyıcının değerlendirilmesi amacıylabağımsızher iki birleşim ve öncelik. Birleşme ve öncelik ne belirlemekoperatörleridam amayoksırasını ne belirlertaşıyıcınındeğerlendirilmesi. Soru sırasıtaşıyıcınındeğerlendirilmesi.

A() B() C() * D() düşünün. Çarpma ise daha yüksek bir öncelik daha Ayrıca ve ayrıca sol ilişkilendirilebilir, bu eşdeğerdir (A() B()) (C() * D()) Ama biliyorum sadece size ilk ek olacak önce ikinci ek ve çarpma olacak önce ikinci ek.Ne kadar süre içinde söylemez(), B(), C() D() adı verilecek!(Ayrıca çarpma önce her ne olursa olsun söyleyin değil ya da ilk ek sonra.) Kurallara itaat etmek son derece mümkün olacaktıröncelik ve birleşimbu gibi: derleme

d = D()          // these four computations can happen in any order
b = B()
c = C()
a = A()
sum = a   b      // these two computations can happen in any order
product = c * d
result = sum   product // this has to happen last

Öncelik ve birleşme tüm kuralları, ilk ek ikinci ek önce olur ve çarpma ikinci olarak orada olur -- takip edilmektedir. Açıkça Bir çağrı yapabiliriz(), B(), C() D ()herhangi birve hala itaat önceliği kuralları ve birleşim düzeni!

Bir kurala ihtiyacımız varalakasızönceliği kuralları ve taşıyıcının değerlendirilme sırasını açıklamak birleşim için.Java ile ilgili kural (C#) "taşıyıcının soldan sağa değerlendirilir".Beri() C solunda görünür (), () önce . değerlendirilir ^em>C olması durumuna() çarpma ve dahil) Ek tek yer.

Şimdi soruyu cevaplamak için yeterli bilgiye sahip. a[b] = b = 0 birleşim kuralları bu a[b] = (b = 0); olduğunu söylüyorlar ama o b=0 ilk çalışır anlamına gelmez. Önceliği kuralları dizin oluşturma ödev, ama daha yüksek bir öncelik olduğunu söylüyorlarbu dizin en sağdaki atama daha önce çalıştığı anlamına gelmez.

Önceliği kuralları ve birleşim kısıtlamalar olduğunu empoze:

  • Dizin oluşturucu işlem sol atama işlemi ile ilgili daha önce çalışması gerekir
  • Ameliyattan sağ taraftaki atama işlemi ile ilişkili olan sol atama işlemi ile ilgili daha önce çalışması gerekir.

Öncelik ve birleşme sadece bize söylesıfır atama10 ** gerçekleşmesi gerekiröncea[b] tayini. Öncelik ve birleşim diyor a[b] değerlendirilmekte olup olmadığı hakkında hiçbir şeyönceyasonra13**.

Yine, bu sadece aynıdır: A()[B()] = C() bildiğimiz Tüm dizin atama önce olmalı. Bir olup olmadığını bilmiyoruz(), B(), C() ilk çalışırönceliğe göre ve birleşim. Başka bir kural bunu bize söylemeniz gerekiyor.

Kural şudur: yine, "ne zaman bir seçim hakkında ne ilk, her zaman soldan sağa": a[b] Yukarı b=0 a[b] çalışırilk, a[1] neden oluyordu. Sonra b=0 olur, ve daha sonra a[1] değer atama en son olur.

Sol şeyden önce doğru şeyler olur. Aradığın kural. Öncelik ve birleşme söz hem de kafa karıştırıcı ve ilgisiz.

İnsanlar yanlış şeylerher zamandaha iyi bilmesi gereken insanlar bile. Düzenlenmekteçok fazlaprogramlama kitapları belirtti kuralları yanlış, bu yüzden hiçbir sürpriz olan çok insan var tamamen yanlış inançlar hakkında ilişkisini öncelik/birleşim ve değerlendirilmesi amacıyla; yani, o gerçekte yok böyle bir ilişki; onlar bağımsız.

Eğer bu konu ilginizi çekerse, daha fazla okuma için bu konuda makaleleri bakın:

http://blogs.msdn.com/b/ericlippert/archive/tags/precedence/

C üzereler# ama bu şeyler çoğu aynı zamanda Java için geçerlidir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • buttheadgsxr1000

    buttheadgsxr

    24 Ocak 2008
  • Krumme1996

    Krumme1996

    21 EYLÜL 2009
  • Ralph Phillips

    Ralph Philli

    5 Aralık 2006