Как работают постинкрементные (i ++) и преинкрементные (++ i) операторы в Java? - PullRequest
81 голосов
/ 03 марта 2010

Можете ли вы объяснить мне вывод этого кода 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);

В обоих случаях выходное значение равно 20

Ответы [ 14 ]

174 голосов
/ 03 марта 2010

++a увеличивает и затем использует переменную.
a++ использует, а затем увеличивает переменную.

Если у вас есть

a = 1;

и вы делаете

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

Кодаддикт объясняет ваш конкретный фрагмент.

125 голосов
/ 03 марта 2010

Помогает ли это?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

Суть в том, что ++a увеличивает значение и немедленно возвращает его.

a++ также увеличивает значение (в фоновом режиме), но возвращает неизменное значение переменной - то, что выглядит, как будто выполняется позже.

40 голосов
/ 19 сентября 2017

В обоих случаях сначала вычисляется значение, но в постинкрементном режиме сохраняется старое значение, а после вычисления возвращается

++ а

  1. a = a + 1;
  2. return a;

A ++

  1. temp = a;
  2. a = a + 1;
  3. возврат температуры;
18 голосов
/ 03 марта 2010
i = ++a + ++a + a++;

есть

i = 6 + 7 + 7

Рабочая : приращение a до 6 (текущее значение 6) + приращение a до 7 (текущее значение 7). Сумма равна 13, теперь добавьте ее к текущему значению a (= 7), а затем увеличьте a до 8. Сумма равна 20, а значение a после завершения назначения равно 8.

i = a++ + ++a + ++a;

есть

i = 5 + 7 + 8

Рабочая : при начальном значении a равно 5. Используйте его в добавлении, а затем увеличьте до 6 (текущее значение 6). Увеличьте значение a с текущего значения 6 до 7, чтобы получить другой операнд +. Сумма равна 12, а текущее значение a равно 7. Затем увеличьте a с 7 до 8 (текущее значение = 8) и добавьте его к предыдущей сумме 12, чтобы получить 20.

8 голосов
/ 03 марта 2010

++a увеличивает a до его оценки. a++ оценивает a и затем увеличивает его.

Относится к вашему выражению:

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

Парентезы, которые я использовал выше, неявно используются Java. Если вы посмотрите на термины таким образом, вы легко увидите, что они оба одинаковы и коммутативны.

6 голосов
/ 05 сентября 2014

В приведенном выше примере

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29
3 голосов
/ 29 июня 2017

++ a - оператор приращения префикса:

  • результат вычисляется и сохраняется первым,
  • тогда используется переменная.

a ++ - это постфиксный оператор приращения:

  • переменная используется первой,
  • затем результат вычисляется и сохраняется.

Как только вы помните правила, EZ для вас, чтобы вычислить все!

2 голосов
/ 14 сентября 2017

Предполагается, что вы имели в виду

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);

Это дает оценку:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

, поэтому я равен 6 + 7 + 7 = 20, и поэтому выводится 20.*

, поэтому я равен 5 + 7 + 8 = 20, и поэтому снова печатается 20.

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

и после того, как вся правая часть оценена (включая установку a в 8), ТО аустановите значение 6 + 7 + 7 = 20, поэтому в последний раз будет напечатано 20 символов.

2 голосов
/ 15 сентября 2016

Я полагаю, однако, что если вы объедините все свои утверждения и запустите их в Java 8.1, вы получите другой ответ, по крайней мере, так говорит мой опыт.

Код будет работать так:

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
1 голос
/ 04 ноября 2018

Предварительное увеличение означает, что переменная увеличивается до того, как она будет вычислена в выражении. Постинкремент означает, что переменная увеличивается после ПОСЛЕ того, как она была оценена для использования в выражении.

Поэтому посмотрите внимательно, и вы увидите, что все три задания арифметически эквивалентны.

...