Немножко о безумии языка Java

Nov 03, 2020 10:31

Готовлюсь к сертификационному экзамену по Java (OCA, 1Z0-808), с трудом прохожу тесты Enthuware. Вот уже неделю волосы стоят дыбом и не опускаются от вопроса - что же курили создатели?

Образец кода:

public class TestClass {
public static void main(String[] args){
byte b = 127;
System.out.println((b+=1)+" "+((Object)b).getClass());
byte a = 127;
Read more... )

информатика

Leave a comment

morfizm November 3 2020, 20:08:24 UTC
Я не вижу тут ничего нелогичного, совершенно очевидные результаты.

В первом случае b += 1 это оператор присваивания, а то, что его можно использовать как "выражение", подставляя в другие выражения, это ну, такой эффект для удобства. Иногда полезно/удобно. Логично, что тип этого выражения будет таким же как и тип переменной b, а b это (signed) byte, а в нём уже лежит значение -128.

(Кстати, если расписать, то b += 1 эквивалентно b = b + 1, и тут мы имеем сначала implicit upcast правого "b" в int, потом сложнение двух int'ов, а потом downcast полученного значения 128 в byte, с получением числа (byte)-128, присваиванием его в левое "b", и с возвращением этого же значения как результат выражения.)

Во втором случае у нас есть выражение a + 1. По типам это byte + int (потому что 1 это, по умолчанию, int, что тоже логично), а когда компилятор складывает значения двух численных типов, то тип результата будет расширенным - ещё большее целое, в которое, по возможсти, входят оба диапазона. Таким образом, результат будет int, а это значит, что byte-овый операнд сначала кастуется к int. Получаем, что a + 1 эквивалентно ((int)a) + 1, поэтому ответ - число типа integer со значением 128.

Я бы вообще запретил implicit typecasts, во всех языках, но тогда у начинающих было бы ещё больше вопросов. Типа, а почему я не могу просто написать a + 1 и у меня не компилируется? А надо было бы либо писать a + (byte)1, либо писать (int)a + 1. Весь интернет плевался бы именно это этого, зато никогда бы не было такого дурацкого задания, как вы привели в образец.

Reply

eternele November 3 2020, 20:58:38 UTC
Если я напишу (byte)1, результат абсолютно такой же. Так что не надо на физиков бочку катить.

Reply


Leave a comment

Up