Jak działają operatory postinkrementacji (i ++) i preinkrementacji (++ i) w Javie?


99

Czy możesz mi wyjaśnić wynik działania tego kodu Java?

int a=5,i;

i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;

System.out.println(a);
System.out.println(i);

W obu przypadkach wynik wynosi 20


9
Zawsze unikaj dwuznacznych stwierdzeń :)
Prasoon Saurav

9
@Prasoon Saurav W przeciwieństwie do C i C ++, Java i C # mają ściśle określoną kolejność oceny, więc te stwierdzenia nie są niejednoznaczne.
Pete Kirkham

12
Wiem o tym, ale nadal tych stwierdzeń nie można (nie można) używać do celów praktycznych, więc należy ich unikać.
Prasoon Saurav


4
@PeteKirkham Minęło ponad sześć lat później, ale nadal chcę zaznaczyć, że „niejednoznaczne” w tej sytuacji jest niejednoznaczne - może oznaczać „kompilator nie wie, co wpisać” lub „Programista nie ma pojęcia, co to znaczy ”.
Załóż pozew Moniki z

Odpowiedzi:


151

czy to pomaga?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

Najważniejsze jest to, że ++azwiększa wartość i natychmiast ją zwraca.

a++ również zwiększa wartość (w tle), ale zwraca niezmienioną wartość zmiennej - to, co wygląda na to, jest wykonywane później.


5
Czy na pewno a == 9 w drugim?
Pete Kirkham

1
i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) ponieważ inkrementacja post ma najwyższy priorytet, czy ++ jest wykonywane jako pierwsze?
rsirs

2
skomplikowany przykład czegoś, co jest łatwe do wyjaśnienia.
oznus

Czy ta odpowiedź jest taka sama dla języków C # i C ++?
przepływ pracy

Dlaczego a, b i c są tutaj równe 2? int a = 1; int b = a++; int c = ++b;Spodziewałem się, że b będzie równe 1, ponieważ jest to przyrost postu.
Dennis

202

++azwiększa, a następnie używa zmiennej.
a++używa, a następnie zwiększa zmienną.

Jeśli masz

a = 1;

i ty to robisz

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

codaddict wyjaśnia Twój konkretny fragment.


62

W obu przypadkach najpierw oblicza wartość, ale po inkrementacji zachowuje starą wartość i po obliczeniu zwraca ją

++ a

  1. a = a + 1;
  2. return a;

a ++

  1. temp = a;
  2. a = a + 1;
  3. temp. powrotu;

8
Najjaśniejsza odpowiedź
Kartik Chugh

2
to był ten, który sprawił, że zrozumiałem jasno ... dzięki.
rematnarab

22
i = ++a + ++a + a++;

jest

i = 6 + 7 + 7

Praca : przyrost od a do 6 (aktualna wartość 6) + przyrost od a do 7 (aktualna wartość 7). Suma wynosi 13, teraz dodaj ją do bieżącej wartości a (= 7), a następnie zwiększ a do 8. Suma wynosi 20, a wartość a po zakończeniu przypisywania wynosi 8.

i = a++ + ++a + ++a;

jest

i = 5 + 7 + 8

Praca : Na początku wartość a wynosi 5. Użyj jej do dodawania, a następnie zwiększ ją do 6 (aktualna wartość 6). Zwiększ wartość z bieżącej wartości 6 do 7, aby uzyskać inny operand +. Suma wynosi 12, a bieżąca wartość a to 7. Następnie zwiększaj a od 7 do 8 (aktualna wartość = 8) i dodaj ją do poprzedniej sumy 12, aby uzyskać 20.


te stwierdzenia działają od prawej do lewej czy od lewej do prawej?
Abhijeet

10

++aprzyrosty aprzed oceną. a++ocenia, aa następnie zwiększa go.

Związane z podanym wyrażeniem:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end

Rodzice, których użyłem powyżej, są domyślnie używane przez Javę. Jeśli spojrzysz na te terminy w ten sposób, łatwo zobaczysz, że są one takie same, ponieważ są przemienne.


1
@ KlasLindbäck przemienność oznacza, że ​​możesz zamienić oba wyrażenia i nadal uzyskać ten sam wynik. A więc a ++ + ++ a == ++ a + a ++ (5 + 7 == 6 + 6; a == 7 na końcu).
Aurril

8

W powyższym przykładzie

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29

4

++ a jest operatorem przyrostu przedrostka:

  • wynik jest obliczany i zapisywany jako pierwszy,
  • następnie używana jest zmienna.

a ++ jest operatorem przyrostu przyrostka:

  • zmienna jest używana jako pierwsza,
  • następnie wynik jest obliczany i zapisywany.

Kiedy już przypomnisz sobie zasady, EZ, aby wszystko obliczyć!


4

Zakładając, że miałeś na myśli

int a=5; int i;

i=++a + ++a + a++;

System.out.println(i);

a=5;

i=a++ + ++a + ++a;

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);

To daje:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

więc i to 6 + 7 + 7 = 20, a więc 20 jest drukowane.

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)

więc i wynosi 5 + 7 + 8 = 20, a więc 20 jest drukowane ponownie.

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

i po ocenie wszystkich prawych stron (łącznie z ustawieniem a na 8) WTEDY a jest ustawiane na 6 + 7 + 7 = 20 i tak 20 jest drukowane po raz ostatni.


3

kiedy awynosi 5, to a++daje 5 do wyrażenia i zwiększa się apóźniej, podczas gdy ++azwiększa się aprzed przekazaniem liczby do wyrażenia (co daje a6 wyrażeniu w tym przypadku).

Więc kalkulujesz

i = 6 + 7 + 7
i = 5 + 7 + 8

3

Wierzę jednak, że jeśli połączysz wszystkie swoje stwierdzenia i uruchomisz je w Javie 8.1, otrzymasz inną odpowiedź, przynajmniej tak mówi moje doświadczenie.

Kod będzie działał następująco:

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29

3

Pre-inkrementacja oznacza, że ​​zmienna jest zwiększana PRZED jej oceną w wyrażeniu. Post-inkrementacja oznacza, że ​​zmienna jest zwiększana PO tym, jak została oceniona pod kątem użycia w wyrażeniu.

Dlatego spójrz uważnie, a zobaczysz, że wszystkie trzy przypisania są arytmetycznie równoważne.


2

przed i po inkrementacji są równoważne, jeśli nie są w wyrażeniu

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10

0
a=5; i=++a + ++a + a++;

jest

i = 7 + 6 + 7

Działająca: przed / po inkrementacja ma skojarzenie „od prawej do lewej” i pre ma pierwszeństwo przed postem, więc najpierw preinkrementacja zostanie rozwiązana jako (++a + ++a) => 7 + 6. następnie a=7jest dostarczany do postInkrementacja => 7 + 6 + 7 =20i a =8.

a=5; i=a++ + ++a + ++a;

jest

i=7 + 7 + 6

Działająca: przed / po inkrementacja ma skojarzenie "od prawej do lewej", a pre ma pierwszeństwo przed postem, więc najpierw zostanie rozwiązany (++a + ++a) => 7 + 6preinkrementacja, tak jak. Then a=7jest dostarczany do postInkrementacja => 7 + 7 + 6 =20i a =8.


0

Uważam, że wykonujesz wszystkie te instrukcje w różny sposób,
wykonanie razem da => 38, 29

int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.