2011-01-10 14 views
7

Kiedy próbuję napisać przyrostek/prefiks w/dekrementacji, a następnie post/prefix w/dekrementacji, pojawia się następujący błąd: Niepoprawny argument operacji ++/-.W języku Java, dlaczego nie mogę napisać i ++++ lub (i ++) ++?

Ale według JLS:

PostIncrementExpression: 
     PostfixExpression ++ 

i

PostfixExpression: 
     Primary 
     ExpressionName 
     PostIncrementExpression 
     PostDecrementExpression 

tak piszących:

PostfixExpression ++ ++ 

powinno być możliwe ... jakieś przemyślenia?

+4

Co oznacza zwrot "i ++"? –

+5

Nie sądzisz, że '- ++ ---- ++ var ++ ---- ++ - ++' może być trochę mylące? – Crozin

+3

Biorąc pod uwagę, że przyrost C++ jest C#, czy próbowałeś użyć 'i #'? ;-) –

Odpowiedz

23

Należy pamiętać, że gramatyka surowy brakuje żadnych semantykę. Jest to po prostu składnia, a nie każdy poprawny składnie program będzie ogólnie poprawny. Na przykład wymóg deklarowania zmiennych przed użyciem nie jest zazwyczaj objęty gramatyką (można, ale jest to uciążliwe).

Zwiększenie Postfixa daje wartość r - i podobnie jak nie można dodawać przyrostowych literałów, nie można zwiększyć przyrostu wyniku o i++.

Cytowanie z JLS (3 rd wydanie, strona 486).:

The result of the postfix increment expression is not a variable, but a value.

+0

Możesz zakodować deklarację przed użyciem w grammerze? Dla dowolnej liczby dowolnych identyfikatorów? – delnan

+0

@delnan: Gramatyki Van Wijngaarden zostały stworzone dla takich rzeczy, tak. Jednak dla wszystkich praktycznych zastosowań gramatyki dwupoziomowe są nieporęczne i można osiągnąć wiele z nich z prostą przypisaną gramatyką, która definiuje asercje, które są propagowane w dół do AST (jeśli dobrze pamiętam, to było kilka lat od tej klasy). – Joey

0

Co próbujesz osiągnąć przez (i ++) ++?

przyrost dwa razy !!

Zastosowanie pętli

Przyrost wewnątrz pętli :)

+3

Ugghh. Na pewno 'i + = 2' jest lepsze niż pętla. –

1

co powinno być wynikiem takiej operacji? Wynik i++ jest (kopia) bieżącej wartości i, a następnie i jest zwiększany (post). Jak więc wyobrażasz sobie, że ponownie zwiększysz wynik i++? Jeśli i pierwotnie miał wartość 1, jaka powinna być jego wartość po i++++ i jaki powinien być wynik tej operacji?

Jeśli się nad tym zastanowisz, prawdopodobnie zdajesz sobie sprawę, że bardzo trudno jest zdefiniować to jako bardzo. Ponieważ projektanci Javy zamierzali unikać "nieokreślonych" pułapek C/C++ (a ponieważ wartość takiego stwierdzenia jest w najlepszym wypadku wątpliwa), prawdopodobnie zdecydowali się to wyraźnie zabronić.

+0

Nie, to nie dlatego. Powodem, jak stwierdzono w innych odpowiedziach, jest to, że wynik wyrażenia i ++ jest wartością, a nie odniesieniem, które można zmienić. –

+0

@John, więc jaki był sens twojego pytania? –

+0

Zapamiętałem to ze względu na komentarze/odpowiedzi. –

8

Błąd informuje o odpowiedź:

unexpected type 
required: variable 
found : value 
     (i++)++; 

Tak, i ++ wyznaczona wartość, podczas gdy operator wymaga zmiennej.

+2

Hm, zależy to od kompilatora, tak myślę. EclipseC daje »Niepoprawny argument do działania ++/-«, który nie jest tak pomocny. – Joey

+0

Interesujące. Tak, to nie jest tak pomocne. Powyższy błąd pochodzi z kompilatora Sun. – JOTN

5

Możesz zastosować tylko ++ lub -- do wyrażenia, które oznacza możliwą do modyfikacji lokalizację (l-wartość). WYNIK z ++ lub -- jest wartością z lokalizacji (wartość r - przed lub po inkrementacji lub dekrementacji), a sama nie jest lokalizacją modyfikowalną.Nie można więc powiedzieć, że jest to (a++)++, ponieważ nie można powiedzieć, że nie ma tam miejsca do modyfikacji.

0

W języku i ++, ++ jest operatorem przyrostkowym, więc zwraca wartość i, a następnie ją zwiększa. Co byś zrobił (i ++) ++? Czy powinien zwracać i + 1 od (i ++ == i)? Jeśli nie, nie byłoby to dziwne, że ja ++ = I, ale (i ++) ++ = i) należy rozważyć następujące wyrażenia:

i++ == i; // true 
j = i++ // j gets the value of i 
j++ == i // still true since j== i 

(i++) ++ == j ++ // what should be the answer here? 

Czy za I + = 2?

2

i ++ jest po prostu skrót:

(i = i + 1)

I to nie miałoby sensu pisać:

(i = i + 1) ++ ;

prawda? :)

+3

'(i = i + 1)' jest * nie * takie samo zachowanie jak '(i ++)' - pierwszy zwraca nową wartość i, druga zwraca poprzednią. –

+0

Przepraszamy. Chyba nie wybrałem dobrego uśmiechu, który wywołuje żartobliwość. Mój błąd. -1 do siebie za to. – Kylar

0

Dlaczego po prostu nie skorzystasz ze skrótu operatora?

i+=2 

Tam.

4

Problem z tym wyrażeniem i = (i ++) ++; jest to, że (i ++) zostaje rozwiązany na wartość i definicja operatora ++ mówi, że 1. zwiększy podaną zmienną i wstawi/zwróci wartość dla tego, bez względu na to, czy używasz Postfix, czy Prefiksu. 2. Ten operator wymaga zmiennej przedrostkowej lub przyrostkowej. Ale to, co się tutaj dzieje (i ++), zwraca wartość i umieszcza ją na miejscu (i ++), a następnie masz (wartość) ++ i (wartość) nie jest oczekiwanym typem dla tego operatora, ponieważ wymaga zmienna w miejsce wartości.

na przykład w Javie, jeśli skompilować następujący kod snippet dostaniesz błąd, jak pokazano po fragmencie:

klasy miejskiej { public void test() { int i = 0; i = (i ++) ++; } }

wyjście

kompilacji:

A.java: 4: nieoczekiwany typ wymagany: zmienna znaleziona: wartość i = (i ++) ++; ^ 1 błąd

1

musi pamiętać: Przyrost & zmniejszania (prefiks & postfix) operator zawsze pracować z zmiennej nie wartości

jestem tutaj wyjaśnić to z jednej exe :

int i = 0; 

int j = (i++)++; 

powyżej exe.

initialize value of i with 0(zero)

in (i++) '++' work with i which is variable & after performing operation return (1)

now in (1)++ '++' work with (1) which is value not variable that is oppose to rules of java that's why compile time error generate Invalid argument to operation ++/--

Powiązane problemy