Вопрос-ответ

Java: Prefix/postfix of increment/decrement operators

Java: префикс / постфикс операторов увеличения / уменьшения

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

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

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

Выводится "6", потому что он принимает i, сохраняет копию, добавляет 1 к переменной, а затем возвращает копию. Таким образом, вы получаете значение, которое было i, но одновременно увеличиваете его. Таким образом, вы выводите старое значение, но оно увеличивается. Красота постфиксного приращения.

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

Ответ 2

Еще один способ проиллюстрировать это:

++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"
Ответ 3

Думайте о ++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 будет увеличено, но возвращаемое значение не было. Следовательно, i на самом деле никогда не будет возвращено как увеличенное значение.

Ответ 4

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


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

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

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

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

i = 0;
test = ++i; // 1
test2 = i++; // 1
java