Что интерпретирует Java-компилятор с помощью `(byte) + (char) - (int) + (long) - 1`?
Возможный дубликат:
Странное поведение Java с приведениями к примитивным типам
Почему этот код в Java,
int i = (byte) + (char) - (int) + (long) - 1;
System.out.println(i);
печатает 1? Почему он даже компилируется?
Источник: Java-разработчики кода
Ответы
Ответ 1
То, что вы делаете, - это объединение типов с унарными операторами.
Итак, посмотрим:
Во-первых, у вас есть значение -1
, которое вы присвоили типу long
.
Затем вы выполняете унарную операцию +
, которая не меняет значение, поэтому у вас все еще есть (long) -1
.
Затем вы добавили его в int, так что теперь мы имеем int -1
. Затем вы используете унарный оператор -
, поэтому мы имеем -(-1)
, который равен 1
.
Затем вы добавили его в char, поэтому у нас есть char 1
. Затем вы используете унарный оператор +
, поэтому у вас все еще есть 1
.
Наконец, значение передается в byte
, поэтому у вас есть byte 1
. И затем он снова (неявно) добавляется к int
.
Ответ 2
Различные части (<type>)
просто разливаются между различными типами. Итак, что происходит, читайте справа, 1
→ -1
→ (long)-1
→ (int)-1
→ -(int)-1 = 1
→ (char)1)
→ (byte)1
, который затем передается в int
во время назначения. Ни в коем случае листинг типа не приводит к эффективному изменению значения, поэтому вся первая строка эквивалентна int i = 1;
.
Ответ 3
Это происходит справа налево. -1 получает бросок до конца. Затем применяется префикс + (который не имеет эффекта), и он преобразуется в int. Затем - применяется (меняя его на 1), и он получает значение char. Наконец, применяется префикс + (который все еще не действует), и он передается в байт.
Ответ 4
позволяет добавить скобки:
int i = ((byte) + ((char) - ((int) + ((long) (- 1)))));
System.out.println(i);
в основном это всего лишь серия бросков и унарных операторов (+
ничего не делает, -
отрицает)
полный поток программы находится в luiscubal answer