2012-09-21 15 views
9

Mój kolega zadał mi to pytanie i jestem trochę zmieszany.Dodawanie int do krótkiego

int i = 123456; 
short x = 12; 

Oświadczenie

x += i; 

kompiluje jednak

x = x + i; 

nie

Co Java tu robi?

+0

Próbujesz dodać int do krótkich jednak. a = b! = b = a –

+0

W rzeczywistości dodajesz int do krótkiego –

+3

Dla zainteresowania spróbuj tego 'char ch = '0'; ch * = 1.2; 'now ch jest' '8'';; –

Odpowiedz

15
int i = 123456; 
short x = 12; 
x += i; 

jest rzeczywiście

int i = 123456; 
short x = 12; 
x = (short)(x + i); 

Zważywszy x = x + i jest po prostu x = x + i. Nie jest on automatycznie rzutowany jako short i dlatego powoduje błąd (x + i jest typu int).


Związek przyporządkowanie ekspresja postaci E1 op= E2 odpowiada E1 = (T)((E1) op (E2)), gdzie T jest typ E1 wyjątkiem, że E1 jest obliczane tylko raz.

- JLS §15.26.2

2

Liczby są traktowane jako int chyba że specjalnie rzucać je inaczej. Tak więc w drugim stwierdzeniu, w którym zamiast zmiennej używa się liczby literalnej, nie jest ona automatycznie rzutowana na odpowiedni typ.

x = x + (short)1; 

... powinien działać.

+0

Napisałem złe równanie. Zaktualizowałem moje pytanie. Zobacz jego 'x = x + i'. –

+0

Ok, to dlaczego nie x = x + x; praca? Problem nie występuje na numerze 1, ale na operatorze +, który zwraca wartość int. – lleite

1

Operator + integralnych typów (INT, krótkie Char bajt) zawsze zwraca int jako wynik.

Widać, że z tym kodem:

//char x = 0; 
//short x = 0; 
//byte x = 0; 
int x = 0; 
x = x + x; 

To nie będzie skompilować chyba x jest int.