Почему byte + = 1 компилировать, но byte = byte + 1 нет?
Если у меня есть байтовая переменная: byte b = 0;
Почему работает следующая работа:
b++;
b += 1; // compiles
... но это не так?
b = b + 1; // compile error
Сначала компилятор понимает как byte
и второй как int
?
[EDIT]
Я знаю кастинг, но хочу обратить ваше внимание на b++, b += 1 and b = b + 1
Я думаю, что они равны, поэтому компилятор их отличает? в чем разница между
b += 1 and b = b + 1 ?
Ответы
Ответ 1
Потому что b += 1
эквивалентен b = (byte)(b + 1)
, тогда как тип b + 1
продвигается до int
(JLS §5.6.2. Двоичное числовое продвижение.), и поэтому его результат не может быть назначен byte
без явного преобразования.
Из JLS, §15.26.2 Операторы присваивания соединений:
Выражение составного присваивания формы E1 op = E2 эквивалентно E1 = (T) ((E1) op (E2)), где T - тип E1, за исключением того, что E1 оценивается только один раз.
Ответ 2
Возможная потеря точности - проблема. Бросьте его, и все в порядке.
b = (byte) (b + 1);
Ответ 3
Да, результатом +
-операции является int
, поэтому для приведения его в соответствие переменной byte
необходим приведение.
Ответ 4
В java значение по умолчанию для целых чисел - int, а для чисел с плавающей запятой - double. Поэтому b
по умолчанию преобразуется в целое число для выполнения операции. Поэтому результирующий ответ должен быть придумано перед сохранением, чтобы предотвратить любую возможную потерю точности. Но b+=1
делает это автоматически.
Ответ 5
операнды типа byte и short автоматически передаются в int перед передачей операторам
поэтому, когда вы делаете байт b = b + 1;
он считает это "int", поскольку операция выполняется по значению байта. поэтому, чтобы этого избежать, мы используем b + = 1; здесь он автоматически присваивается байту.
Ответ 6
Вам нужно передать в байт:
b = (byte) (b + 1);
Ответ 7
Выполнение b + 1
расширяет результат до целого числа, а присвоение обратно байту b приведет к потере точности. Объяснено: Конверсии и рекламные акции. Но мне нравится, как лучше ответить axtavt.
Ответ 8
Я не покупаю аргумент о потере точности, поскольку компилятор не будет защищать вас аналогичным образом при работе с ints и longs.
Я думаю, что реальный ответ заключается в том, что JLS просто лучше поддерживает ints, чем байты, как указано в этом ответе:
fooobar.com/info/342113/...