2011-10-06 20 views
5
byte b1 = 3; 
byte b2 = 0; 

b2 = (byte) (b2 + b1); // line 3 
System.out.println(b2); 

b2 = 0; 
b2 += b1;    // line 6 
System.out.println(b2); 

Satırı 3, sonucu bir bayt olarak yazmazsak bir derleyici hatasıdır. Bunun nedeni, toplama sonucunun her zaman int ve int'ye uymaması olabilir. bir bayt. Ama görünüşe göre, 6. satırda yazım yapmak zorunda değiliz. Her iki ifade de, satır 3 ve satır 6, eşdeğer değil mi? Eğer değilse, başka ne farklı?bayt eklerken farklı derleyici davranışı

cevap

10

Evet, iki satır eşdeğerdir - ancak dilin farklı bölümlerini kullanırlar ve JLS'nin farklı bölümleri tarafından kaplanırlar. Satır 3, int'a yükseltilmiş olan baytlara uygulanan ve int sonucunu veren normal + işleçtir. Bu, byte değişkenine geri atayabilmeniz için yayınlanmalıdır. Çalışma zamanında

ifadesi, iki yoldan biri ile değerlendirilir:

satır 6 section 15.26.2 of the JLS tarif edildiği gibi bir bileşik atama operatördür. Soldaki işlenen ifadesi bir dizi erişim ifadesi değilse, dört adım gereklidir:

  • İlk olarak, soldaki işlenen bir değişken üretmek için değerlendirilir. Bu değerlendirme aniden tamamlanırsa, atama ifadesi aynı nedenden dolayı aniden tamamlanır; Sağ işlenen, değerlendirilmez ve atama gerçekleşmez.
  • Aksi takdirde, soldaki işlenenin değeri kaydedilir ve ardından sağdaki işlenen değerlendirilir. Bu değerlendirme aniden tamamlanırsa, atama ifadesi aynı nedenden dolayı aniden tamamlanır ve hiçbir atama gerçekleşmez.
  • Aksi takdirde, sol el değişkeni ile sağdaki işlenenin değeri kaydedilen değeri, bileşik atama operatörü tarafından belirtilen ikili işlemi gerçekleştirmek için kullanılır. Bu işlem aniden tamamlanırsa, atama ifadesi aynı nedenden dolayı aniden tamamlanır ve hiçbir atama gerçekleşmez.
  • Aksi takdirde, ikili işlemin sonucu, sol değişkeninin türüne dönüştürülür, değer kümesi dönüştürmeye (§5.1.13) uygun standart değer kümesine tabi tutulur (genişletilmiş üslü değer kümesi değil)) ve dönüşümün sonucu değişkene kaydedilir.

O farklı kılan (vurgulanan) son parçası. = E2E1 = (T) ((E1) op eşdeğerdir şekilde E1 op

bir bileşik atama ifade (:

Aslında bölümünün başlangıcı denkliği göstermektedir E2)) T'un E1 türünde olduğu, E1 yalnızca bir kez değerlendirilmiştir.

+1

Başka soru yok, onurunuz. – f1sh

+2

Jon Skeet tarafından ilk sorumu yanıtladığım için iyi hissediyorum :) – Zohaib

-2

Java, tümleşik türleri içeren işlemler ve dönüşümler üzerinde bir karmaşa yaptı. En iyi tavsiye, her fırsatta int kullanın. byte/short/char'dan kaçının, herhangi bir hesaplamadan önce bunları açıkça int'a dönüştürün.

+2

Jon Skeet'in "karışıklık" ın nasıl çalıştığına dair kapsamlı bir açıklama yapmasından sonra bu 2 saati neden yayınladınız? Bazen 'int' dışındaki türleri kullanmak anlamlıdır. – EboMike