Подтвердить что ты не робот

Почему смешение + и приведение не приводит к ошибке в "+ (int) + (long) -1"?

Почему эта печать 1?

import java.util.*;
import java.lang.*;
import java.io.*;


class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        System.out.println((byte)+(short)-(int)+(long)-1);
    }
}

Можно ли смешивать кастинг и +,- унарные операторы? Я знаю, что мы можем делать кастинг несколько раз, но почему не помещает + ,- унарные операторы между ошибками?

4b9b3361

Ответ 1

Вы не добавляете и не вычитаете. Те + и - операторы - это унарные знаковые операторы.

Смотрите документация в разделе Унарные операторы.

Последовательность на кону:

(byte)+(short)-(int)+(long)-1

оценивается справа налево следующим образом:

начальное значение равно -1 кастинг длинным (который все еще -1)
знак унарного + (все еще -1)
литье в int (все еще -1)
унарный знак (теперь значение равно 1)
и так далее (значение остается 1 до конца)

Ответ 2

Эти + и - являются унарными.

В частности, это фактически:

System.out.println((byte) (+((short) (-((int) (+((long) -1)))))));

Ответ 3

если вы удалите все кастинг из своего примера, потому что в этом случае он ничего не сделает

System.out.println((byte)+(short)-(int)+(long)-1);

станет

System.out.println( + - + -1);

теперь вы можете видеть, что только операторы все еще существуют, и поскольку минус и минус плюс, ваш результат будет 1

в принципе вы можете думать об этом как:

var mylong  = +(long)-1;      <- -1
var myint   = -(int)mylong;   <-  1
var myshort = +(short)myint;  <-  1
var mybyte  =  (byte)myshort; <-  1

Ответ 4

Я знаю, что мы можем делать кастинг несколько раз. Но положив +, - унарные операторы между ними не дают ошибку?

Это просто следствие последовательности Java-грамматики. Когда вы пишете

+ 1

то, что вы на самом деле написали, является унарным числовым выражением, которое разлагается на две части:

  • оператор унарного плюса: +
  • числовое выражение, в данном случае int литерал 1.

Другим примером числового выражения является выражение cast (также унарное):

(int) 1

Поэтому вы можете заменить это для исходного 1 выше:

+ (int) 1

Повторяя такой же согласованный процесс, мы можем получить вложенное унарное выражение произвольной сложности. Чтобы вернуться к вашему ключевому вопросу:

почему?

Потому что Java действительно нуждается в определенном правиле против таких выражений.