Что интерпретирует 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