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
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
Odpowiedzi:
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 ++a
zwię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.
int a = 1; int b = a++; int c = ++b;
Spodziewałem się, że b będzie równe 1, ponieważ jest to przyrost postu.
++a
zwię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.
W obu przypadkach najpierw oblicza wartość, ale po inkrementacji zachowuje starą wartość i po obliczeniu zwraca ją
++ a
a ++
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.
++a
przyrosty a
przed oceną.
a++
ocenia, a
a 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.
++ a jest operatorem przyrostu przedrostka:
a ++ jest operatorem przyrostu przyrostka:
Kiedy już przypomnisz sobie zasady, EZ, aby wszystko obliczyć!
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.
kiedy a
wynosi 5, to a++
daje 5 do wyrażenia i zwiększa się a
później, podczas gdy ++a
zwiększa się a
przed przekazaniem liczby do wyrażenia (co daje a
6 wyrażeniu w tym przypadku).
Więc kalkulujesz
i = 6 + 7 + 7
i = 5 + 7 + 8
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
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.
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=7
jest dostarczany do postInkrementacja => 7 + 6 + 7 =20
i 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 + 6
preinkrementacja, tak jak. Then a=7
jest dostarczany do postInkrementacja => 7 + 7 + 6 =20
i a =8
.
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)