Загадка компилятора

Кто-нибудь может объяснить, почему вот здесь

int i = 0;
i = i++;
System.out.println(i); // вернет 0


а здесь

int i = 0;
i++;
System.out.println(i); // вернет 1


?

9 комментариев

realcorwin
Ясно. Никто :).
RSeropyan
Посмотрите вот тут: habrahabr.ru/post/216189/
realcorwin
Спасибо, интересная статья.

Но она лишь обрисовывает проблему. И специфична для C++. Интересно было бы почитать что-то конкретно для Java. А именно про то, почему для компилятора было выбрано то или иное поведение (неопределённости у него нет, вывод всегда один) и какое когда именно.
ferasinka
Байт-код первого варианта:

        int i = 0;
        byte var10000 = i;
        int var2 = i + 1;
        i = var10000;
        System.out.println(i);


Байт-код второго варианта:

        int i = 0;
        int i = i + 1;
        System.out.println(i);


В первом случае идет разбивка на две операции:
Присвоение значения переменной i ей же
Инкремент переменной i (т.к. постфиксная форма)

Во втором, по сути, одна операция, которую можно разложить на:
i = i + 1;
realcorwin
Это понятно. Но почему так?

По идее нужно было присвоить i 0, а потом постфиксно увеличить i на 1. И вывести 1.
Ravermeister
Потому что постинкремет увеличивает значение переменной на 1 и возвращает предыдущее значение, которое(это 0) присваивается переменной.
realcorwin
То есть сначала прибавляет, а после всё равно возвращает предыдущее значение.

А есть ссылка, где всё это чётко и стандартизировано изложено?
fatfaggy
как я понимаю, эта задачка скорее просто размять мозги? ну или из серии «удивительное рядом»?)
потому что я не вижу прикладной ценности в ней. в том плане, что мало кто станет всерьез в своем коде делать что-то типа такого:
i = i++;

лично мне это больше похоже на говнокод, честно говоря))
поэтому и знание таких деталей не очень ценно, ведь мало кто будет использовать такие конструкции в реальном проекте :) так что не стоит переживать, если с ходу не смог ответить на такой «простой» казалось бы вопрос :)
но, конечно же, знания как и почему оно так работает ни в коем случае не помешают :)
realcorwin
В тесте на сертификацию полно такого вот :).
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.