int x = 0;
while (x < 3) {
x = x++;
System.out.print(x + " ");
}
Я понимаю, что если написано y = x++, то сначала y присваивается значение х, после чего х увеличивается на единицу. Почему этого не происходит с выражением х = х++?
x = x++;
эквивалентно
int tmp = x;
x++;
x = tmp;
Сначала присваивается старое значение, делается инкрементирование, присваивается старое значение - поэтому цикл бесконечный, x = 0 всегда.
x++ увеличивает x и возвращает старое значение (т.е. 0). x = присваивает старое значение обратно. И x снова становится равным 0. В следующей итерации все повторяется;
В итоге x всегда будет 0
Посмотрите в отладчике.
Если рассмотреть, байткод который генерируется из выражения :
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;
Потому что у вас стоит постфиксный инкремент, то есть сначала присваивается, а потом инкрементируется. Чтобы работало нужно использовать префиксный инкремент ++x
погуглите про отличия постфиксного и префиксного инкремента/декремента.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей