Сбивающий код, компилируется в порядке. Как работает этот код?

Следующий код компилирует и дает 1 в качестве вывода, его немного запутывает для меня. Я попробовал javap для этого, но оттуда тоже не мог понять. Я проверил для подобных сообщений, но не смог найти аналогичный вопрос здесь.

Посмотрите на код:

int i = (byte) + (char) - (int) + (long) - 1;
System.out.println(i);

здесь используется байт-код

Compiled from "Test.java"
public class Test {
  public Test();
  public static void main(java.lang.String[]);
}

Как работают здесь типы? зависит ли он от размера типа данных? Как работает код?

Ответы

Ответ 1

Это всего лишь последовательность унарных + и - операций, смешанных с типом приведения.

Вы начинаете с -1, отбрасываете его до длинного, унарный плюс ничего не делает, бросает его в int, унарный минус (значение теперь +1), отбрасывается на char, унарный +, отбрасывается в байт.

Ответ 2

Вы можете читать как

int i = + - + - 1;
System.out.println(i);

или если вы предпочитаете

int i = - - 1;
System.out.println(i);

или если вы предпочитаете

int i = -1 * - 1;
System.out.println(i);

другие приведения не имеют эффекта.