Sind und a = a + 10
beide gleich, oder gibt es einen Unterschied zwischen ihnen? Ich habe diese Frage während des Studiums in Java bekommen.Unterschied zwischen a + = 10 und a = a + 10 in Java?
Antwort
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
entsprichtE1 = (T)((E1) op (E2))
, wobeiT
der TypE1
ist, außer dassE1
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.
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.
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
Das sollten Sie im Themenstart klargestellt haben. – BalusC
@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. –
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.
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.
Und welchen Wert hätte "Byte a = 100; a + = 1000;" zu a? –
Die 8 niedrigstwertigen Bits der binären Darstellung von 1100, genauso wie ein int in ein Byte umgewandelt wird, tut dies immer. – meriton
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
- System berechnet den Wert von a (eine neue Kopie isoliert ist creat ed hier)
- -System werden 10 isolierte Variable
a
dann wird der Wert von isoliertena
auf der linken Seite zugewiesena
Aber in zweiten Fall
- 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,
- 1. Unterschied zwischen diesen Ausdrücken: int * a = 0; int * a = 10;
- 2. Unterschied zwischen a - = b und a = a - b in Python
- 3. Unterschied zwischen 'a == null' und 'null == a'
- 4. Gibt es einen Unterschied zwischen A a; und A a = A()?
- 5. Unterschied zwischen a || a = b und a = a || b in Rubin?
- 6. Numpy: Unterschied zwischen a [i] [j] und a [i, j]
- 7. Unterschied zwischen $ a == 5 und 5 == $ a in php
- 8. Was ist der Unterschied zwischen auto a = A (3) und A a (3)?
- 9. int a = (int) ((0,7 + 0,1) * 10). Warum a = 7?
- 10. Unterschied zwischen $ ('# tabs a') und $ ('# tabs'). Finden ('a')
- 11. Unterschied zwischen „? Alert (a) '' und '' alert (a); var a = 1; '' in JavaScript
- 12. Unterschied zwischen nicht null (a), wo (a) und argwhere (a). Wann welche verwenden?
- 13. Was ist der Unterschied zwischen double a = a + int b und int a + = double b?
- 14. Was ist der Unterschied zwischen 'Float a = 3f' und 'Float a = 3.0' in Java?
- 15. Leistungsdifferenz zwischen einem + = b und a = a + b
- 16. Was ist der Unterschied zwischen IS-A-Beziehung und HAS-A-Beziehung? Java
- 17. Diffrence zwischen $ a = ''; und $ a = NULL; in php
- 18. Was ist der Unterschied zwischen „$ a“ und ein in Unix $
- 19. Play Framework 2.4 schreibt [-A] gegen OWrites [-A], Format [A] vs OFormat [A]. Zweck?
- 20. Unterschied zwischen if (a - b <0) und if (a <b)
- 21. Numpy: Differenz zwischen dot (a, b) und (a * b) .sum()
- 22. Wie tauscht [b] [b = a, 0] zwischen a und b?
- 23. Warum behandelt Numpy a + = b und a = a + b anders?
- 24. Was ist der Unterschied zwischen a [0] und & a [0] in der Zeichenkette
- 25. Was ist der Unterschied zwischen "a ist b" und "id (a) == id (b)" in Python?
- 26. Was ist der Unterschied zwischen a (i, :) und [a] in Matlab?
- 27. Unterschied zwischen f (a, b) und f (a) (b) in Scala
- 28. Irgendein Unterschied zwischen t <'a> und 'a t in F #?
- 29. Warum int & a=10; gilt in alten C++ - Compiler?
- 30. 'erklären -A x' vs 'erklären -A x =()'
Bitte verzeihen Sie meine Unwissenheit, aber warum 'a + 10' ist vom Typ int, wenn a als Byte definiert wurde? –
@ 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 –
Oh, danke Jon. –