Не могли бы вы объяснить мне вывод этого 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 в обоих случаях
Не могли бы вы объяснить мне вывод этого 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 в обоих случаях
Ответы:
Это помогает?
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++
также увеличивает значение (в фоновом режиме), но возвращает неизменное значение переменной - похоже, что это выполняется позже.
int a = 1; int b = a++; int c = ++b;
Ожидал, что b будет равно 1, поскольку это инкремент сообщения.
++a
увеличивает, а затем использует переменную.
a++
использует, а затем увеличивает значение переменной.
Если у вас есть
a = 1;
а ты делаешь
System.out.println(a++); //You will see 1
//Now a is 2
System.out.println(++a); //You will see 3
codaddict объясняет ваш конкретный фрагмент.
В обоих случаях он сначала вычисляет значение, но при постинкременте сохраняет старое значение и после вычисления возвращает его.
++ а
а ++
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.
++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. Если вы посмотрите на термины с этой точки зрения, вы легко увидите, что они оба такие же, как и коммутативные.
++ a - оператор приращения префикса:
a ++ - оператор постфиксного приращения:
Как только вы запомните правила, EZ для вас, чтобы все рассчитать!
Предполагая, что вы имели в виду
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)
поэтому i равно 6 + 7 + 7 = 20, поэтому печатается 20.
i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)
поэтому i равно 5 + 7 + 8 = 20, и поэтому снова печатается 20.
a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)
и после того, как вся правая часть оценена (включая установку a на 8), THEN a устанавливается на 6 + 7 + 7 = 20, и поэтому 20 печатается в последний раз.
когда a
равно 5, то a++
выдает 5 выражению и a
затем увеличивает его , а затем ++a
увеличивает a
перед передачей числа в выражение (которое a
в данном случае дает 6 выражению).
Итак, вы рассчитываете
i = 6 + 7 + 7
i = 5 + 7 + 8
Однако я считаю, что если вы объедините все свои утверждения и запустите их на 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
Предварительное приращение означает, что переменная увеличивается ДО того, как она оценивается в выражении. Постинкремент означает, что переменная увеличивается ПОСЛЕ того, как она была оценена для использования в выражении.
Поэтому посмотрите внимательно, и вы увидите, что все три назначения арифметически эквивалентны.
a=5; i=++a + ++a + a++;
является
i = 7 + 6 + 7
Работа: пре / пост инкремент имеет ассоциативность "справа налево", а пре имеет приоритет над постом, поэтому в первую очередь пре-инкремент будет решен как (++a + ++a) => 7 + 6
. then a=7
предоставляется для увеличения поста => 7 + 6 + 7 =20
и a =8
.
a=5; i=a++ + ++a + ++a;
является
i=7 + 7 + 6
Работа: пре / пост инкремент имеет ассоциативность «справа налево», а пре имеет приоритет над постом, поэтому в первую очередь будет (++a + ++a) => 7 + 6
решено пре-инкремент, поскольку. Затем a=7
предоставляется пост инкремент => 7 + 7 + 6 =20
и a =8
.
Я считаю, что вы выполняете все эти операторы по-разному,
выполняя их вместе, вы получите => 38, 29
int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated,
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)