Мне сказали, что существуют различия между + = b; и a = a + b; что может привести к тому, что только один из них будет легальным в зависимости от типа декалерации.Разница между a + = b и a = a + b в Java
У кого-нибудь есть пример этого?
Мне сказали, что существуют различия между + = b; и a = a + b; что может привести к тому, что только один из них будет легальным в зависимости от типа декалерации.Разница между a + = b и a = a + b в Java
У кого-нибудь есть пример этого?
В основном нет разницы, однако есть тонкая разница.
Операторы арифметического присваивания выполняют неявное литье. например
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.
int a = 10;
int b = 20;
a=a+b; // 30
a+=b; // 30
System.out.println(a);
Оба дадут тот же ответ.
ПСБ (раздел 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
и для других арифметических и побитовых операторов.
[this] (http://stackoverflow.com/questions/19957085/why-are-arithmetic-assignment-operators-more-efficient) может помочь вам –
Спасибо! Это то, что я искал, например. объявление «a» в виде байта и «b» в качестве int приведет к тому, что a = a + b является незаконным и a + = b является законным. – mmgro27