2010-01-17 15 views

Antwort

30

Wie Sie jetzt schon erwähnt Gießen ... es einen Unterschied in diesem Fall ist:

byte a = 5; 
a += 10; // Valid 
a = a + 10; // Invalid, as the expression "a + 10" is of type int 

Aus der Java Language Specification section 15.26.2:

Verbindung Zuordnung Ausdruck der Form E1 op= E2 entspricht E1 = (T)((E1) op (E2)), wobei T der Typ E1 ist, außer dass E1 nur einmal ausgewertet wird.

Interessanterweise gibt das Beispiel, das sie in der Spezifikation:

short x = 3; 
x += 4.6; 

ist gültig in Java, aber nicht in C# ... im Grunde in C# der Compiler führt Spezial-Gehäuse von + = und - = um sicherzustellen, dass der Ausdruck entweder vom Zieltyp ist oder ein Literal im Bereich des Zieltyps ist.

+0

Bitte verzeihen Sie meine Unwissenheit, aber warum 'a + 10' ist vom Typ int, wenn a als Byte definiert wurde? –

+0

@ Raúl: Aufgrund der binären numerischen Promotion. Effektiv gibt es keinen "Byte + (Byte, Byte)" Operator. Siehe http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.6.2 –

+0

Oh, danke Jon. –

16

Es gibt keinen Unterschied, der eine ist abgekürzt für den anderen. Sogar der Compiler wird die gleichen Anweisungen für beide erzeugen.

Bearbeiten: der Compiler erzeugt nicht den gleichen Code für beide, wie ich gerade herausgefunden habe. Check this out:

dan$ cat Test.java 
public class Test { 
    public static void main(String[] args) { 
     int a = 0; 
     a = a + 10; 
     a += 20; 
    } 
} 

dan$ javap -c Test 
Compiled from "Test.java" 
public class Test extends java.lang.Object{ 
public Test(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: iconst_0 
    1: istore_1 
    2: iload_1 
    3: bipush 10 
    5: iadd 
    6: istore_1 
    7: iinc 1, 20 
    10: return 

} 

So die kurze Antwort, vor allem für einen Java-Anfänger, oder jemand, der über die Optimierung bei der kleinsten Ebene nicht besorgt ist, ist, dass sie austauschbar sind. Die lange Antwort wird davon abhängen, dass ich über iadd vs iinc lese.

Bearbeiten 2: Ok, ich bin zurück. Die Befehlsdaten sind (grob) wie folgt:

iadd - fügt die beiden oberen ints auf dem Stapel

Iinc - Schritten eine lokale Variable mit einem konstanten

Und wie wir oben gesehen haben können wir mit iinc ein paar Anweisungen speichern, solange auf der rechten Seite eine Konstante steht.

Aber was passiert, wenn wir

a += a haben?

Dann sieht der Code wie folgt aus:

7: iload_1 
    8: iload_1 
    9: iadd 
    10: istore_1 

, die die gleiche Sache ist, dass wir, wenn wir a = a + a haben.

+0

ich das wissen. aber ich lese da ist etwas Unterschied im Zusammenhang mit Casting. Ich habe es nicht verstanden, fragte hier, um mehr darüber zu erfahren. – GuruKulki

+1

Das sollten Sie im Themenstart klargestellt haben. – BalusC

+0

@danben: Ich bin froh, die Bearbeitung zu sehen (da der Compiler * nicht den gleichen Code erzeugt). Aber sobald eine JIT-fähige JVM (wie HotSpot) es in die Finger bekommt, ist mein Verdacht, dass, wenn es keinen anderen Effekt von dem Ausdruck gibt, sogar die längere Form für die Inkrementierungsoperation optimiert wird. –

4

In der Ausdrücken Sie zeigen, sind sie in einem Ausdruck wie äquivalent:

array[getIndex(context)][some/complex + expression] += offset; 

Sie eine Vorstellung zu bekommen, in welchen Situationen der Operator + = (und die anderen Zuweisungsoperator) nützlich ist. Wenn der Ausdruck nicht-trivial ist, verhindert der Operator + = Fehler und verbessert die Lesbarkeit und somit die Wartbarkeit.

5

Dies ist in der Java Language Specification, section 15.25.2 definiert. Der vorspringende Teil ist:

Verbindung Zuweisungsausdruck von die Form E1 op = E2 zu E1 entspricht = (T) ((E1) op (E2)), wobei T die Art von E1 ist, außer dass E1 nur einmal ausgewertet wird.

Das heißt, in Ihrem Fall ist die Differenz der implizite Typumwandlung:

byte a = 100; 
a += 1000; // compiles 
a = a + 1000; // doesn't compile, because an int cannot be assigned to a byte. 
+0

Und welchen Wert hätte "Byte a = 100; a + = 1000;" zu a? –

+0

Die 8 niedrigstwertigen Bits der binären Darstellung von 1100, genauso wie ein int in ein Byte umgewandelt wird, tut dies immer. – meriton

1

Es gibt einige Terminologien in S/W-Feld, ich dir das erklären kann,

in a=a+1 Belegung für a wird gemessen, nachdem zwei Schritten

  1. System berechnet den Wert von a (eine neue Kopie isoliert ist creat ed hier)
  2. -System werden 10 isolierte Variable a dann wird der Wert von isolierten a auf der linken Seite zugewiesen a

Aber in zweiten Fall

  1. System den Wert von a und direkt weiß addiere 10 zu a (keine isolierte Kopie wurde hier gemacht).

Hoffnung Ihnen dies hilfreich sein wird, und eine weitere Sache, wir in der Regel Methode verwenden, die a += 10; ist, weil es die Betriebskosten zu reduzieren, wie pro andere ein,

Verwandte Themen