2016-11-06 13 views
9

Jest to bardziej teoretyczne pytanie, aby zrozumieć ocenę arytmetyczną Javy. Ponieważ + i - mają takie samo pierwszeństwo, nie do końca rozumiem, w jaki sposób Java analizuje następujące wyrażenia (gdzie jest więcej niż jeden operator + i - między dwoma operandami).Pierwszeństwo Java dla wielu operatorów + i -

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 
} 

Z 8 język Java Specification (§15.8.2)

operator wykonuje binarne + dodatek, gdy stosuje się dwa operandy typu liczbowego, dając sumę operandów.
Operator binarny wykonuje odejmowanie, tworząc różnicę dwóch operandów liczbowych.
[...]
Dodawanie jest operacją przemienną, jeśli wyrażenia operandowe nie mają skutków ubocznych.
Dodawanie całkowe jest asocjacyjne, gdy wszystkie operandy są tego samego typu.

Co zauważyłem, to to, że za każdym razem, gdy #operator jest równy, wynik jest taki sam, a kolejność nie ma znaczenia. Ale gdy #operator jest dziwny, nie musi to wpływać na wynik. Na przykład. w poniższych dwóch wyrażeniach jest jeszcze jeden - niż +, jednak wynik jest inny.

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

Przy tych wszystkich informacjach nadal nie widzę wzoru ani sposobu, w jaki to działa.

+0

wierzę * a + -b * jest wykonywane jako * a + (-b) *. sprawdzanie go –

+1

@Sanket Makani '-' i '++' nie są dozwolone w tym przypadku ponieważ Java bierze to za operację inkrementacji/dekrementacji – ncw

Odpowiedz

9

W matematyce, jak oceniłbyś to?

a - + - b 

Dodanie kilku uchwytów pomaga:

a - (+ (-b)) 

Możemy to zrobić, ponieważ w ten sposób nie narusza zasady pierwszeństwa.

Wtedy możemy zacząć ograniczać: + (-b) jest naprawdę -b i a - -b jest naprawdę a + b, więc wynik jest 1 + 2 = 3.

Zobaczmy ten drugi:

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

tak proste zasady pracy z matematyki w sposób naturalny.

2

wierzę, że znak - negować wyrażenia:

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

zarówno druk -1. To jest z oracle docs:

Unary minus operator; neguje wyrażenie

minus po prostu zmienia znak liczby po nim. Jeśli b były ujemne, to a+-b zwróciłby 3.

2

Jest oceniany tak, jak w przypadku obliczeń w matematyce z dodawaniem i odejmowaniem. W twoim przykładzie wszystkie twoje obliczenia zaczynają się od mniejszego numeru a=1, wtedy masz - i + znaków między małą liczbą a większą liczbą b = 2. na przykład, gdy robisz 1 -- 2, robisz , ponieważ znaki 2 - znoszą się nawzajem, staje się 1 + 2, 1 - 2 będzie -1, ponieważ 2 (większa liczba ma znak -, co sprawia, że ​​jest liczbą całkowitą ujemną, dodając 1 do ujemnej liczby całkowitej zwiększa jego wartość o jeden

2

To wydaje się być problem matematyczny ... (- & - = +), (- & + = -) i (+ & + = +)

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 
Powiązane problemy