2014-10-10 7 views
1

Мне сказали, что существуют различия между + = b; и a = a + b; что может привести к тому, что только один из них будет легальным в зависимости от типа декалерации.Разница между a + = b и a = a + b в Java

У кого-нибудь есть пример этого?

+0

[this] (http://stackoverflow.com/questions/19957085/why-are-arithmetic-assignment-operators-more-efficient) может помочь вам –

+0

Спасибо! Это то, что я искал, например. объявление «a» в виде байта и «b» в качестве int приведет к тому, что a = a + b является незаконным и a + = b является законным. – mmgro27

ответ

6

В основном нет разницы, однако есть тонкая разница.

Операторы арифметического присваивания выполняют неявное литье. например

byte a = 1; 
int b = 2; 

a += b; // compiles 
a = a + b; // doesn't compile as a byte + int = int 
a = (byte) (a + b); // compiles as this is the same as += 

Для более странных примеров.

int a = 5; 
a += 1.5f; 
// a == 6 

char ch = '0'; // (char) 49 
ch *= 1.1;  // ch = '4'; 

long l = Integer.MAX_VALUE; 
l += 0.0f; // i = (long) ((long) l + 0.0f) 
// i == Integer.MAX_VALUE + 1L; WTF!? 
// l is no longer Integer.MAX_VALUE due to rounding error. 
-1
int a = 10; 
int b = 20; 
a=a+b; // 30 

a+=b; // 30 

System.out.println(a); 

Оба дадут тот же ответ.

1

ПСБ (раздел 15.26.2) говорит:

Выражение присваивания соединение вида E1 оп = E2 эквивалентно E1 = (T) ((Е1) оп (E2)), где T - тип E1, за исключением того, что E1 оценивается только один раз.

Присутствие типа отлитого означает, что есть несколько краевых случаев, когда a = a op b означает что-то другое a op= b.

См. Ответ Питера Лори на один пример. Это когда a является byte и b является int, а «op» - +. «Gotcha» равен a + b, производит int, который затем не присваивается a ... без приведения в соответствие с типом.

То же самое относится к другим типам для a и b и для других арифметических и побитовых операторов.