Приоритет Java для нескольких операторов + и -

Это скорее теоретический вопрос, чтобы понять, как Java оценивает арифметические операции. Поскольку + и - имеют одинаковый приоритет, я не совсем понимаю, как Java оценивает следующие выражения (где между двумя операндами более одного оператора + и -).

public static void main(String[] args) {
    int a = 1;
    int b = 2;
    System.out.println(a+-b);    // results in -1
    System.out.println(a-+b);    // results in -1
    System.out.println(a+-+b);   // results in -1
    System.out.println(a-+-b);   // results in  3
    System.out.println(a-+-+b);  // results in  3
    System.out.println(a+-+-b);  // results in  3
    System.out.println(a-+-+-b); // results in -1
    System.out.println(a+-+-+b); // results in  3
}

Из спецификации языка Java 8 (§15.8.2):

Двоичный оператор + выполняет сложение при применении к двум операндам числового типа, получая сумму операндов.
Двоичный оператор - выполняет вычитание, получая разность двух числовых операндов.
[...]
Сложение является коммутативной операцией, если выражения операндов не имеют побочных эффектов.
Целочисленное сложение является ассоциативным, если все операнды одного типа.

Что я также заметил, так это то, что каждый раз, когда операторы # четные, результат один и тот же, а порядок не имеет значения. Но когда операторы # нечетные, это не обязательно влияет на результат. Например. в следующих двух выражениях - больше, чем +, но результат другой.

System.out.println(a-+-b);   // results in 3
System.out.println(a-+-+-b); // results in -1

Со всей этой информацией я до сих пор не вижу закономерности или того, как это работает.


person ncw    schedule 06.11.2016    source источник
comment
я считаю, что a+-b выполняется как a+ (-b) . проверить это   -  person Srinath Ganesh    schedule 06.11.2016
comment
@Sanket Makani -- и ++ в этом случае не допускаются, потому что Java воспринимает это как операцию увеличения/уменьшения   -  person ncw    schedule 06.11.2016


Ответы (4)


С точки зрения математики, как бы вы это оценили?

a - + - b   

Добавление некоторых скобок помогает:

a - (+ (-b))

Мы можем это сделать, потому что это не нарушает правила приоритета.

Затем мы можем начать уменьшать: + (-b) на самом деле -b, а a - -b на самом деле a + b, поэтому результат 1 + 2 = 3.

Смотрим второй:

a - + - + - b
a - (+ (- (+ (-b))))
a - (+ (- (-b)))
a - (+ b)
a - b
1 - 2 = -1

Поэтому простые правила математики работают естественным образом.

person janos    schedule 06.11.2016

Я считаю, что знак - отрицает выражения:

int a = 1;
int b = 2;
System.out.println(a+(-b));
System.out.println(a+-b);

оба печатают -1. Это из документов оракула:

Унарный минус оператор; отрицает выражение

минус просто меняет знак числа после него. Если бы b было отрицательным, то a+-b вернуло бы 3.

person ItamarG3    schedule 06.11.2016

Это похоже на математическую проблему... (- & - = +), (- & + = -) и (+ & + = +)

int a = 1;
int b = 2;
System.out.println(a+-b);    // 1 +(-2) = 1-2 = -1
System.out.println(a-+b);    // 1-(+2) = 1-2 = -1
System.out.println(a+-+b);   // 1+-(+2) = 1-(+2) = 1-2 = 1
System.out.println(a-+-b);   // 1- + (-2) = 1- (-2) = 1+2 =3 
System.out.println(a-+-+b);  // 1 - + - (+2) = 1 - - (+2) = 1-2 = -1
System.out.println(a+-+-b);  // 1+ - + (-2) =1 - + (-2) = 1+2 = 3 
System.out.println(a-+-+-b); // 1-+-+(-2) = 1 - - (-2) = 1 + (-2) = -1
System.out.println(a+-+-+b); // 1 +- +- (+2) = 1 -- (+2) = 1+2 = 3
person Lord Thanatos    schedule 06.11.2016

Его оценивают в том, как вы выполняете вычисления по математике с помощью сложения и вычитания. В вашем примере все ваши расчеты начинаются с меньшего числа a=1, затем у вас есть знаки - и + между маленьким числом и большим числом b=2. например, когда вы делаете 1 -- 2, вы делаете 1+2, потому что 2 знака - отменяют друг друга, становится 1 + 2, 1 - 2 будет -1, потому что 2 (большее число имеет знак -, что делает его отрицательным целым числом, добавляя 1 к отрицательному целому числу увеличивает свою стоимость на единицу

person Osama Salama    schedule 06.11.2016