2013-03-31 10 views
7

mam napotkasz następującym zaskakującej linii:Java int + = podwójny składnia niespodzianka

int x = 7; 
x += 0.5; 

jest składnia pozornie legalne! Po dodaniu x wciąż wynosi 7, więc double jest rzutowany na int i zaokrąglany do 0, ale odbywa się to bez wyraźnego rzucania w kodzie. Czy ktoś jeszcze jest tym zaskoczony? Jakie jest uzasadnienie?

edytuj, aby wyjaśnić moje pytanie: Czy ktoś może podać uzasadnienie tej decyzji? Wydaje mi się to okropną decyzją wymagającą wyraźnego rzucania wszędzie, ale mam to jedyne miejsce w języku, w którym po cichu wyrzucasz dane. Czy czegoś brakuje?

+0

interesujące. Jestem pewien, że [JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/index.html) rozwiązuje ten problem. Czy spojrzałeś na to, aby zobaczyć, co mówi? –

+0

@Hovercraft: JLS podaje specyfikację, ale nie uzasadnienie decyzji, o to właśnie pytam. –

Odpowiedz

12
x += 0.5; 

odpowiada:

x = (int) (x + 0.5) 

Ogólnie:

x += y odpowiada x = (type of x) (x + y)


Patrz 15.26.2. Compound Assignment Operators

+0

Rozumiem to. Co zaskakuje mnie to, że kompilator na to pozwala! W drugiej linii znajduje się wyraźna obsada, która zmusza programistę do rozpoznania, że ​​mogą tracić pewne informacje. Na przykład x = x + .5 nie kompiluje się, ale x + = .5 robi ... dziwne, nie? –

+0

@EricLindauer wcale nie jest dziwny, 'x + 0,5' daje podwójną wartość, a' (int) (x + 0,5) 'jest liczbą całkowitą. –

+2

Chyba nie jestem jasny ... Rozumiem, że specyfikacja mówi, że tak to działa. Moje pytanie brzmi: DLACZEGO ?? Jak ktokolwiek może usprawiedliwić dopuszczenie x + = .5, ale nie dopuszczając x = x + .5 ?! Wydaje mi się to szalone. –

0

jest taki sam jak x = (int) (x + 0.5);.

0

To dlatego operatory przypisania związek stawia niejawny obsady (automatyczna cast): Więc

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

Czy istnieje ku temu dobry powód? –

+1

@EricLindauer: Jeśli 'x' jest' short', nawet jeśli 'y' jest również, instrukcja taka jak' x = x + y; 'byłaby nielegalna bez wyraźnego typecast. Java zachowuje się tak, jakby wynik obliczony przez dowolnego operatora arytmetyczno-złożonego był wyraźnie typograficzny dla typu wyniku, niezależnie od tego, czy ma to sens w konkretnym przypadku. – supercat