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"
}
}
9 ответов
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 и возвращает копию. Таким образом, вы получаете значение, которым я был, но также увеличиваете его одновременно. Поэтому вы распечатываете старое значение, но оно увеличивается. В beautfy из постфиксного инкремента.
затем при печати из i он показывает реальную ценность i, потому что она была увеличена. 7
я знаю, что на это был дан ответ, но подумал, что другое объяснение может быть полезно.
другой способ проиллюстрировать это:
++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"
думать ++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 будет увеличена, но возвращенное значение не было. Поэтому я никогда не вернусь как увеличенное значение.
почему переменная не была обновлена?
- Postfix: передает текущее значение i функции,а затем увеличивает его.
- Prefix: увеличивает текущее значение, а затем передает его функции.
строки, в которых вы ничего не делаете со мной, не имеют значения.
обратите внимание, что это также верно для выполнения заданий:
i = 0;
test = ++i; // 1
test2 = i++; // 1
System.out.println(i++); // "6"
об этом передает println
значение, которое я имел до этой строки кода (6), а затем увеличивает I (до 7).
печати 7 для последнего оператора, cos в заявлении выше, это значение 6 и он увеличивается до 7, когда последний оператор печатается
хорошо подумать об этом с точки зрения временных переменных.
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"
возможно, вы можете лучше понять префикс / постфикс с этим примером.
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);
}
}
вот мой ответ. Некоторым из вас это легко понять.
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.
}
}