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