Готовлюсь к сертификационному экзамену по 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... )
В первом случае 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
Reply
Leave a comment