Почему x = x++ не приводит к увеличению значения x в цикле?

397
28 декабря 2016, 03:48
int x = 0;
while (x < 3) {
    x = x++;
    System.out.print(x + " ");
}

Я понимаю, что если написано y = x++, то сначала y присваивается значение х, после чего х увеличивается на единицу. Почему этого не происходит с выражением х = х++?

Answer 1
x = x++;

эквивалентно

int tmp = x;
x++;
x = tmp;

Сначала присваивается старое значение, делается инкрементирование, присваивается старое значение - поэтому цикл бесконечный, x = 0 всегда.

Answer 2

x++ увеличивает x и возвращает старое значение (т.е. 0). x = присваивает старое значение обратно. И x снова становится равным 0. В следующей итерации все повторяется;

В итоге x всегда будет 0

Посмотрите в отладчике.

Answer 3

Если рассмотреть, байткод который генерируется из выражения :

int x = 0;
x = x++;

То получим следущее:

 0: iconst_0     // положить на стек 0
 1: istore_1     // сохранение значения в переменную 1
 2: iload_1      // положить на стек значение из переменной 1
 3: iinc  1, 1   // увеличение значения переменной с индексом 1 на 1
 6: istore_1     // сохранение значения 0 в переменную 1
 7: return

Что эквивалентно:

byte var10000 = x;
int x1 = x + 1;
x = var10000;
Answer 4

Потому что у вас стоит постфиксный инкремент, то есть сначала присваивается, а потом инкрементируется. Чтобы работало нужно использовать префиксный инкремент ++x

погуглите про отличия постфиксного и префиксного инкремента/декремента.

READ ALSO
Java - узнать разрядность ОС Windows средствами Java

Java - узнать разрядность ОС Windows средствами Java

Дело в том, что в моем приложении в зависимости от разрядности ОС нужно вызывать разные методыСобственно, возник вопрос: как я с помощью java-кода...

514
Решение систем уравнений на java

Решение систем уравнений на java

Можете подсказать библиотеку, которая решает cистемы уравненийНапример:

520
Как запустить activity в cordova?

Как запустить activity в cordova?

Не могу запустить в cordova интентВот код:

393
POST запрос в андроид

POST запрос в андроид

в gradle прописано:

446