2013-03-31 11 views
7

ho incontrato la seguente riga di sorprendente:Java int + = doppio sintassi sorpresa

int x = 7; 
x += 0.5; 

è sintassi apparentemente legale! Dopo l'aggiunta, x è ancora 7, quindi il double viene lanciato su un int e arrotondato a 0, ma ciò avviene senza alcun cast esplicito nel codice. Qualcun altro è sorpreso da questo? Qual è la logica qui?

modifica per chiarire la mia domanda: qualcuno può dare una buona ragione per questa decisione? Mi sembra una decisione terribile richiedere un casting esplicito in qualsiasi altro posto, ma avere questo punto nella lingua in cui si eliminano dati in modo silenzioso. Mi sto perdendo qualcosa?

+0

Interessante. Sono sicuro che la [JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/index.html) risolve questo problema. Hai dato un'occhiata per vedere cosa dice? –

+0

@Hovercraft: JLS fornisce le specifiche, ma non la giustificazione per la decisione, che è ciò che sto chiedendo. –

risposta

12
x += 0.5; 

è equivalente a:

x = (int) (x + 0.5) 

In generale:

x += y è equivalente a x = (type of x) (x + y)


Vedi 15.26.2. Compound Assignment Operators

+0

Capisco questo. Ciò che mi sorprende è che il compilatore lo consenta! Nella tua seconda linea, c'è un cast esplicito, che costringe il programmatore a riconoscere che potrebbero perdere alcune informazioni. Ad esempio, x = x + .5 non viene compilato, ma x + = .5 fa ... strano, no? –

+0

@EricLindauer non è affatto strano, 'x + 0.5' produce un doppio, mentre' (int) (x + 0.5) 'è un numero intero. –

+2

Immagino di non essere chiaro ... Capisco che la specifica dice che è così che funziona. La mia domanda è: PERCHÉ ?? Come può qualcuno giustificare il permesso x + = .5, ma non consentire x = x + .5 ?! Mi sembra pazzesco. –

0

x += 0.5; corrisponde a x = (int) (x + 0.5);.

0

Questo perché operatori di assegnamento composto mette un cast implicita (Cast automatico): Così

x+=0.5 => x =(int)(x + 0.5) => x = (int)(7.5) => x = 7 
+0

C'è una buona ragione per farlo? –

+1

@EricLindauer: Se 'x' è un' short', anche se 'y' è uguale, un'istruzione come' x = x + y; 'sarebbe illegale senza un typecast esplicito. Java si comporta quindi come se il risultato calcolato da qualsiasi operatore di assegnazione dell'aritmetica composta fosse esplicitamente convertito nel tipo di risultato, indipendentemente dal fatto che abbia o meno senso in un caso particolare. – supercat