Java: + = Äquivalenz

8

ist:

%Vor%

entspricht:

%Vor%     
dukevin 10.03.2010, 04:31
quelle

3 Antworten

38

Nein, sie entsprechen NICHT der Art, wie Sie sie ausgedrückt haben.

%Vor%

Das Problem mit der dritten Zeile ist, dass - eine so genannte "numerische Promotion" ausführt ( JLS 5.6 ) der Operanden short und ergibt einen int -Wert, der nicht ohne weiteres einem short zugewiesen werden kann. Zusammengesetzte Zuweisungsoperatoren enthalten eine verborgene Besetzung!

Die genaue Äquivalenz ist in JLS 15.26.2 Compound Assignment festgelegt Betreiber :

  

Ein zusammengesetzter Zuweisungsausdruck der Form E1 op = E2 ist äquivalent zu E1 = (T) ((E1) op (E2)) , wobei gilt T ist der Typ von E1 , außer dass E1 nur einmal ausgewertet wird.

Um einige der Feinheiten zu verdeutlichen:

  • Zusammengesetzte Zuordnungsausdrücke ordnen die Operanden nicht neu an
    • Die linke Seite bleibt auf der linken Seite, die rechte bleibt auf der rechten Seite
  • Beide Operanden sind vollständig in Klammern gesetzt, um sicherzustellen, dass op die niedrigste Priorität hat
    • int x = 5; x *= 2 + 1; // x == 15, not 11
  • Es gibt eine versteckte Besetzung
    • int i = 0; i += 3.14159; // this compiles fine!
  • Die linke Seite wird nur einmal ausgewertet
    • arr[i++] += 5; // this only increments i once

Java hat auch *= , /= , %= , += , -= , <<= , >>= , >>>= , &= , ^= und |= . Die letzten 3 sind auch für boolesche Werte definiert ( JLS 15.22.2 Boolean Logical Operators ).

Verwandte Fragen

polygenelubricants 10.03.2010, 04:38
quelle
5

Ja, ist es. Diese Syntax ist in den meisten C-abgeleiteten Sprachen gleich.

    
Chuck 10.03.2010 04:33
quelle
2

Nicht genau. Der Grund für die Einführung in C war, dass der Programmierer einige Optimierungen durchführen konnte, die der Compiler nicht konnte. Zum Beispiel:

%Vor%

wurde früher viel besser kompiliert als

%Vor%

von den Compilern der Zeit.

Und wenn "x" Nebenwirkungen hat, z.B. "x ++", dann ist das völlig anders.

    
Richard Pennington 10.03.2010 04:39
quelle