Java: prefix / postfix operatorów increment/decrement?

Z poniższego programu lub tutaj , Dlaczego ostatnie wywołanie System.out.println(i) wyświetla wartość 7?

class PrePostDemo {
     public static void main(String[] args){
          int i = 3;
          i++;
          System.out.println(i);    // "4"
          ++i;             
          System.out.println(i);    // "5"
          System.out.println(++i);  // "6"
          System.out.println(i++);  // "6"
          System.out.println(i);    // "7"
     }
}
Author: gnerkus, 2011-03-24

9 answers

i = 5;
System.out.println(++i); //6

To wypisuje "6", ponieważ trzeba dodać jeden do niego i zwraca wartość. 5+1=6; jest to prefiks, dodawanie do liczby przed użyciem jej w operacji.

i = 6;
System.out.println(i++); //6 (i = 7, prints 6)

To wyświetla "6", ponieważ zajmuje i, przechowuje kopię, dodaje 1 i zwraca kopię. Więc otrzymujesz wartość, którą byłem, ale także zwiększasz ją w tym samym czasie. Dlatego drukujesz starą wartość, ale jest ona zwiększana. Piękny Postfix przyrost.

Następnie, kiedy wydrukować i, to pokazuje prawdziwa wartość i, ponieważ została zwiększona. 7

 57
Author: Spidy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 10:29:56

Wiem, że to zostało już wyjaśnione, ale pomyślałem, że inne wyjaśnienie może być pomocne.

Innym sposobem na zilustrowanie tego jest:

++i da wynik new i, i++ poda wynik oryginalnego i i zapisze new i do następnej akcji.

Sposób myślenia o tym polega na zrobieniu czegoś innego w wyrażeniu. Podczas drukowania bieżącej wartości i, zależy to od tego, czy i została zmieniona w wyrażeniu, czy po ekspresja.
    int i = 1;
result i = ++i * 2 // result = 4, i = 2

i jest oceniany (zmieniany) przed obliczeniem wyniku. Drukowanie i dla tego wyrażenia pokazuje zmienioną wartość i użytą dla tego wyrażenia.

result i = i++ * 2 // result = 2, i = 2

i jest oceniany po wyniku w obliczeniu. Tak więc Wydruk {[7] } z tego wyrażenia daje oryginalną wartość i użytą w tym wyrażeniu, ale i jest nadal zmieniany dla dalszych zastosowań. Tak więc wydrukowanie wartości i zaraz po wyrażeniu pokaże nowy wartość przyrostowa i. Ponieważ wartość i zmieniła się, niezależnie od tego, czy jest drukowana, czy używana.

result i = i++ * 2 // result = 2, i = 2
System.out.println(i); // 2

Jeśli zachowałeś spójny wzorzec i uwzględniłeś linie wydruku dla wszystkich wartości:

  int i = 3; 
System.out.println(i);    //  3
System.out.println(i++);  //  3
System.out.println(i);    // "4"
System.out.println(++i);  //  5          
System.out.println(i);    // "5"
System.out.println(++i);  // "6"
System.out.println(i++);  // "6"
System.out.println(i);    // "7"
 12
Author: Yvette Colomb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-18 06:30:50

Pomyśl o ++i i i++ jako podobnych do i = i+1., chociaż nie jest to to samo. Różnica polega na tym, kiedy rzeczywiście i zostanie przypisana z nowym przyrostem.

W ++i przyrost następuje natychmiast.

Ale jeśli i++ jest tam przyrost nastąpi, gdy program przejdzie do następnej linii.

Spójrz na kod tutaj.

int i = 0;
while(i < 10){
   System.out.println(i);
   i = increment(i);
}

private int increment(i){
   return i++;
}

Spowoduje to niekończącą się pętlę . ponieważ i zostanie zwrócona z oryginalną wartością i po średniku i zostanie zwiększona, ale zwrócona wartość nie było. W związku z tym nigdy nie będzie rzeczywiście zwrócony jako wartość przyrostową.

 3
Author: Dilruk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-14 19:21:23

Dlaczego zmienna nie została zaktualizowana?

  • Postfix: przekazuje bieżącą wartość i do funkcji, a następnie ją zwiększa.
  • Prefix: zwiększa bieżącą wartość i przekazuje ją do funkcji.
Linie, z którymi nic nie robisz, nie mają znaczenia.

Zauważ, że dotyczy to również Zadań:

i = 0;
test = ++i;  // 1
test2 = i++; // 1
 2
Author: Steven Jeuris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 01:09:11
System.out.println(i++);  // "6"

To wysyła println wartość, którą miałem przed tą linią kodu (6), a następnie zwiększa I (do 7).

 2
Author: Jumbogram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-14 19:21:47

Drukuje 7 dla ostatniego twierdzenia, bo w powyższym twierdzeniu jego wartość jest 6 po wydrukowaniu ostatniej instrukcji

 1
Author: Guest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-12 20:51:09

Pomyśl o tym w kategoriach zmiennych tymczasowych.

i =3 ;
i ++ ; // is equivalent to:   temp = i++; and so , temp = 3 and then "i" will increment and become     i = 4;
System.out.println(i); // will print 4

Teraz,

i=3;
System.out.println(i++);

Jest równoważne

temp = i++;  // temp will assume value of current "i", after which "i" will increment and become i= 4
System.out.println(temp); //we're printing temp and not "i"
 0
Author: Raj Shetty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-25 04:05:09

Może w tym przykładzie zrozumiesz lepiej prefiks/postfix.

public class TestPrefixPostFix 
{
    public static void main (String[] args)
    { 
        int x=10;
        System.out.println( (x++ % 2 == 0)?"yes "+ x: " no "+x);
        x=10;
        System.out.println( (++x % 2 == 0)?"yes "+ x: " no "+x);
    }
}    
 0
Author: Lanavia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-11 16:44:31

To moja odpowiedź. Niektórym z Was może okazać się to łatwe do zrozumienia.

package package02;

public class C11PostfixAndPrefix {

    public static void main(String[] args) {
        // In this program, we will use the value of x for understanding prefix 
        // and the value of y for understaning postfix. 
        // Let's see how it works. 

        int x = 5; 
        int y = 5; 

        Line 13:   System.out.println(++x);  // 6   This is prefixing. 1 is added before x is used. 
        Line 14:   System.out.println(y++);  // 5   This is postfixing. y is used first and 1 is added. 

        System.out.println("---------- just for differentiating");

        System.out.println(x);  // 6   In prefixing, the value is same as before {See line 13}
        System.out.println(y);  // 6   In postfixing, the value increases by 1  {See line 14} 

        // Conclusion: In prefixing (++x), the value of x gets increased first and the used 
        // in an operation. While, in postfixing (y++), the value is used first and changed by
        // adding the number. 
    }
}
 0
Author: Babu Ram Acharya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-04 00:54:06