Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
инкременты и декременты в java
#1
PHP код:
<?php 
int a
= 2;
a += --a + a * ++a + a++ +a++;

int c= 2;
c += --c + c * ++c + c++ +c--;

System.out.println(a);
System.out.println(c);

a==10
c
==10

Поясните, пожалуйста, как происходит вычесление.
Ответ
#2
niko42 Написал:Поясните, пожалуйста, как происходит вычесление.

PHP код:
<?php 
int a
= 2;
a += --a + a * ++a + a++ +a++;
2 1 1 2 2 3

int c
= 2;
c += --c + c * ++c + c++ +c--;
2 1 1 2 2 3

System
.out.println(a);
System.out.println(c);

a==10
c
==10

В случае, когда используется постфиксный инкремент/декремент (а++ или а--), то сначала возвращается значение переменное, после чего увеличивается/уменьшается ее значение на 1.

С префиксным инкрементом/декрементом (++а или --а), наоборот, сначала увеличивается/уменьшается значение на 1, затем значение переменной возвращается.
Ответ
#3
Lihoy Написал:
PHP код:
<?php 
int a
= 2;
a += --a + a * ++a + a++ +a++;
2 1 1 2 2 3

int c
= 2;
c += --c + c * ++c + c++ +c--;
2 1 1 2 2 3

System
.out.println(a);
System.out.println(c);

a==10
c
==10

В случае, когда используется постфиксный инкремент/декремент (а++ или а--), то сначала возвращается значение переменное, после чего увеличивается/уменьшается ее значение на 1.

С префиксным инкрементом/декрементом, наоборот, сначала увеличивается/уменьшается значение на 1, затем значение переменной возвращается.
Спасибо. Как бы это действие понятно: --a + a * ++a переведем 1 +1*2
Интересует следующие действие: + a++ +a++

Добавлено через 2 минуты
Если более детально.
То не пойму логики
int a= 2;
a = a++;
а == 2

int a= 2;
a = a++ + a++;
а == 5
Почему первая операция без изменений, а вторая изменяет.

Я так понимаю в постфиксный операции - в первой операции мы тупо возвращаем значение, а во второй уже увеличиваем. Верно ли суждение?
Ответ
#4
niko42 Написал:Спасибо. Как бы это действие понятно: --a + a * ++a переведем 1 +1*2
Интересует следующие действие: + a++ +a++

После "--a + a * ++a" значение а составляло 2.
Теперь переходим к "a++ + a++".

а++ = 2 (т.к. постфиксный инкремент, мы сначала вернули значение а, которое равно 2, затем увеличили а на 1. Таким образом, сейчас значение а составляет 3)

a++ = 3 (т.к. постфиксный инкремент, мы сначала вернули значение а, которое равно 3, затем увеличили а на 1. Таким образом, сейчас значение а составляет 4, которое, к слову, далее нигде уже в расчете принимать участие не будет).

В итоге:
a = 2 + 1 + 1*2 + 2 + 3 = 10

UPD.
Цитата:Если более детально.
То не пойму логики
int a= 2;
a = a++;
а == 2

int a= 2;
a = a++ + a++;
а == 5
Почему первая операция без изменений, а вторая изменяет.

Потому, что в первом случае:
1. мы вернули значение 2
2. увеличили а на 1 (в памяти оно стало 3)
3. но потом значению а было присвоено значение 2 (которое мы вернули ранее).

Во втором же случае:
1. мы для первого слагаемого (а++) вернули значение 2
2. увеличили значение а на 1 (в памяти оно стало 3)
3. для второго слагаемого (а++) вернули значение 3 (т.к. ранее увеличили а на 1)
4. опять увеличили значение а на 1 (в памяти оно стало 4)
5. но в итоге, присвоили значению а (которое в памяти 4) значение суммы 2 + 3 = 5.
Ответ
#5
Lihoy Написал:После "--a + a * ++a" значение а составляло 2.
Теперь переходим к "a++ + a++".

а++ = 2 (т.к. постфиксный инкремент, мы сначала вернули значение а, которое равно 2, затем увеличили а на 1. Таким образом, сейчас значение а составляет 3)

a++ = 3 (т.к. постфиксный инкремент, мы сначала вернули значение а, которое равно 3, затем увеличили а на 1. Таким образом, сейчас значение а составляет 4, которое, к слову, далее нигде уже в расчете принимать участие не будет).

В итоге:
a = 2 + 1 + 1*2 + 2 + 3 = 10

UPD.


Потому, что в первом случае, мы вернули значение 2, увеличили а на 1 (в памяти оно стало 3), но потом значению а было присвоено значение 2 (которое мы вернули ранее).

Во втором же случае, мы для первого слагаемого (а++) вернули значение 2, увеличили значение а на 1 (в памяти оно стало 3), для второго слагаемого (а++) вернули значение 3 (т.к. ранее увеличили а на 1), опять увеличили значение а на 1 (в памяти оно стало 4). Но в итоге, присвоили значению а (которое в памяти 4) значение суммы 2 + 3 = 5.

Воо огромное спасибо. Все понятно.

Если кому интересно:
PHP код:
<?php 
//алгоритм не четных чисел
for(int i=0; i<10; i++){
System.out.println(++i);
}
//алгоритм четный чисел
for(int i=0; i<10; i++){
System.out.println(i++);
}

Добавлено через 10 минут
Lihoy:
Смотрите еще такой момент:
int a = 2;
a += --a + a * ++a + a++ +a++;
Выполнили все операции постфиксные и префиксные, в итоге сейчас в int a лежит 4 (исходя из последней постфиксной операции)
То почему
2 + = 1 + 1*2 + 2 + 3 = 10

а не

4 + = 1 + 1*2 + 2 + 3 = 12
Ответ
#6
2 += 1 + 1*2 + 2 + 3 (a)
2 += 1 + 1*2 + 2 + 3 ©

последние ++ и -- не дают ничего

Добавлено через 2 минуты
первая a у вас не менятся при операциях справа от знака равенства
[Изображение: l2nextgen.gif]
Ответ
#7
bloodshed Написал:2 += 1 + 1*2 + 2 + 3 (a)
2 += 1 + 1*2 + 2 + 3 ©

последние ++ и -- не дают ничего

Добавлено через 2 минуты
первая a у вас не менятся при операциях справа от знака равенства

Все ясно спасибо.
Ответ
#8
niko42 Написал:Lihoy:
Смотрите еще такой момент:
int a = 2;
a += --a + a * ++a + a++ +a++;
Выполнили все операции постфиксные и префиксные, в итоге сейчас в int a лежит 4 (исходя из последней постфиксной операции)
То почему
2 + = 1 + 1*2 + 2 + 3 = 10

а не

4 + = 1 + 1*2 + 2 + 3 = 12

Потому, что изначальное выражение a += --a + a * ++a + a++ +a++;
эквивалентно a = a + --a + a * ++a + a++ +a++;

А т.к. изначально а у нас равно 2, имеем то, что имеем Smile
Ответ
#9
Lihoy Написал:Потому, что изначальное выражение a += --a + a * ++a + a++ +a++;
эквивалентно a = a + --a + a * ++a + a++ +a++;

А т.к. изначально а у нас равно 2, имеем то, что имеем Smile
Весело=) Благодарю!
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Сервер майнкрафт 1.17 не видит Java 16 Erikvd2244 0 590 05-18-2023, 05:59 PM
Последний пост: Erikvd2244
  Требуется Java разработчик в RVR мод л2 slimak 0 2,401 03-19-2018, 11:08 PM
Последний пост: slimak
  Java Unicode Boris2105 1 2,795 08-10-2017, 02:09 AM
Последний пост: klubheads
  Java junior Tails 18 7,164 07-17-2017, 03:52 PM
Последний пост: n3k0nation
  Установить старую java ZIP 2 3,393 09-27-2016, 10:39 AM
Последний пост: Aquanox
  Учебники и книги по Java 2 CHIPSET 47 55,178 09-06-2016, 10:14 PM
Последний пост: sawayik
  Java == API == Libraries Kenrix 1 2,214 05-11-2014, 05:28 PM
Последний пост: n3k0nation
  Java 8 JavaMan 33 9,424 04-08-2014, 01:06 PM
Последний пост: SouthBridge
  Опрос от Оракла: Особенности Java EE 8 JavaMan 0 1,520 01-11-2014, 04:13 AM
Последний пост: JavaMan
  Java NB Задачи на последовательность NDWT 0 2,198 12-26-2013, 04:47 PM
Последний пост: NDWT

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)