2014-01-23 6 views
9

Ich habe einen kleinen Test gemacht, um eine short zu manipulieren und ich stieß auf ein Kompilierungsproblem. Die folgende Code Kompilierung:Unterschied zwischen s = s + s und s + = s mit kurzen

short s = 1; 
s += s; 

während dieses nicht:

short s = 1; 
s = s + s; //Cannot convert from int to short 

Ich habe gelesen, dass shorts zu int automatisch gefördert werden, aber was ist der Unterschied zwischen diesen beiden Codes?

+0

möglich duplicate von [Java + = operator] (http://stackoverflow.com/questions/8710619/java-operator) – Raedwald

Antwort

17

Sie haben Recht, dass short zu ints befördert werden. Dies tritt während der Auswertung des binären Operators + auf, und es ist als binäre numerische Promotion bekannt.

Dies wird jedoch effektiv mit Compound-Zuweisungsoperatoren wie += gelöscht. Section 15.26.2 of the JLS Zustände:

Verbindung Zuweisungsausdruck von der Form E1 op = E2 entspricht E1 = (T) ((E1) op (E2)), wobei T die Art von E1 ist, mit der Ausnahme, dass E1 ist nur einmal bewertet.

Das heißt, es ist gleichbedeutend mit Casting zurück zu short.

+0

Ich mochte deine Antwort mehr als meine, als du aufgestanden bist und ich meins entfernt, Gut Job. –

+1

@Patrick: Es gibt einen anderen Weg, auf dem sich die Verbindungszuordnung unterscheidet. Offensichtlich ist x = y + z; bedeutet nicht x = x * y + z; sondern "x = x * (y + z);". Nun, das gleiche gilt für '+'. "x + = y + z" bedeutet "x = x + (y + z)", nicht "x = x + y + z". Der rechte Zusatz geschieht * vor * dem linken Zusatz, wenn Sie auf diese Weise '+ =' verwenden. In der Algebra ist die Addition assoziativ und kommutativ, aber Computermathematik kann diese Eigenschaften verletzen. Das Ergebnis von 'x + = y + z' muss nicht dasselbe sein wie 'x = x + y + z'. –