Java: Префикс / постфикс операторов увеличения / уменьшения? - PullRequest
29 голосов
/ 24 марта 2011

Из приведенной ниже программы или здесь , почему последний вызов System.out.println(i) выводит значение 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"
     }
}

Ответы [ 9 ]

63 голосов
/ 24 марта 2011
i = 5;
System.out.println(++i); //6

Это печатает "6", потому что требуется, я добавляю один к нему и возвращает значение.5 + 1 = 6;Это префикс, добавление к номеру перед использованием его в операции.

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

Это печатает «6», потому что оно берет i, сохраняет копию, добавляет 1 и возвращает копию.Таким образом, вы получаете значение, которым я был, но одновременно увеличиваете его.Поэтому вы распечатываете старое значение, но оно увеличивается.Функция увеличения постфикса.

Затем, когда вы распечатываете i, он показывает реальное значение i, потому что оно было увеличено.7

14 голосов
/ 18 ноября 2013

Я знаю, что на этот вопрос уже дан ответ, но подумал, что может помочь другое объяснение.

Другой способ проиллюстрировать это:

++i даст результат new i,i++ выдаст результат исходного i и сохранит new i для следующего действия.

Можно подумать об этом, делая что-то еще внутри выражения.Когда вы печатаете текущее значение i, оно будет зависеть от того, было ли i изменено в выражении или после выражения.

    int i = 1;
result i = ++i * 2 // result = 4, i = 2

i оценивается (изменяется) доРезультат рассчитан.Печать i для этого выражения показывает измененное значение i, используемое для этого выражения.

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

i оценивается после вычисления результата.Таким образом, печать i из этого выражения дает исходное значение i, используемое в этом выражении, но i все еще изменяется для любого дальнейшего использования.Таким образом, печать значения для i сразу после выражения покажет новое увеличенное значение i.Поскольку значение i изменилось, независимо от того, напечатано оно или используется.

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

Если вы сохранили согласованный шаблон и включили строки печати для всех значений:

  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"
5 голосов
/ 09 июля 2013

Думайте о ++i и i++ как о ПОХОЖЕЙ на i = i+1. Но это НЕ ТО ЖЕ. Разница в том, когда i получает новое приращение.

в ++i, приращение происходит немедленно.

но если i++, то приращение произойдет, когда программа перейдет на следующую строку.

Посмотрите на код здесь.

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

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

Это приведет к бесконечному циклу . потому что i будет возвращено с исходным значением, а после точки с запятой я буду увеличиваться, но возвращаемое значение не было. Поэтому i никогда не будет возвращено как увеличенное значение.

2 голосов
/ 24 марта 2011

Почему переменная не была обновлена?

  • Постфикс: передает текущее значение i в функцию, а затем увеличивает его.
  • Префикс: увеличивает текущее значениеи затем передает его в функцию.

Строки, где вы ничего не делаете, не имеют значения.

Обратите внимание, что это также верно для назначений:

i = 0;
test = ++i;  // 1
test2 = i++; // 1
2 голосов
/ 24 марта 2011
System.out.println(i++);  // "6"

Это отправляет println значение, которое я имел до этой строки кода (6), а затем увеличивает I (до 7).

1 голос
/ 12 февраля 2018

Он печатает 7 для последнего оператора, потому что в приведенном выше утверждении это значение равно 6 и увеличивается до 7, когда последний оператор печатается

0 голосов
/ 04 января 2017

Это мой ответ.Некоторым из вас может быть легко это понять.

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 голосов
/ 11 марта 2015

Возможно, вы сможете лучше понять Префикс / постфикс с этим примером.

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 голосов
/ 25 мая 2013

Хорошо подумайте об этом в терминах временных переменных.

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

Теперь

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

эквивалентно

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"
...