JavaRush/Java блог/Архив info.javarush/Загадка компилятора
realcorwin
14 уровень

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

Статья из группы Архив info.javarush
участников
Кто-нибудь может объяснить, почему вот здесь int i = 0; i = i++; System.out.println(i); // вернет 0 а здесь int i = 0; i++; System.out.println(i); // вернет 1 ?
Комментарии (8)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Filin Filin
Уровень 25
7 января 2020, 18:43
Попробуйте так : int i = 0; i = ++i; System.out.println(i);
fatfaggy
Уровень 26
23 декабря 2017, 01:23
как я понимаю, эта задачка скорее просто размять мозги? ну или из серии «удивительное рядом»?)
потому что я не вижу прикладной ценности в ней. в том плане, что мало кто станет всерьез в своем коде делать что-то типа такого:
i = i++;

лично мне это больше похоже на говнокод, честно говоря))
поэтому и знание таких деталей не очень ценно, ведь мало кто будет использовать такие конструкции в реальном проекте :) так что не стоит переживать, если с ходу не смог ответить на такой «простой» казалось бы вопрос :)
но, конечно же, знания как и почему оно так работает ни в коем случае не помешают :)
realcorwin
Уровень 14
24 декабря 2017, 01:20
В тесте на сертификацию полно такого вот :).
ferasinka
Уровень 32
21 декабря 2017, 17:08
Байт-код первого варианта:

        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
Уровень 14
21 декабря 2017, 18:27
Это понятно. Но почему так?

По идее нужно было присвоить i 0, а потом постфиксно увеличить i на 1. И вывести 1.
realcorwin
Уровень 14
21 декабря 2017, 13:29
Ясно. Никто :).
RSeropyan
Уровень 25
21 декабря 2017, 13:34
Посмотрите вот тут: habrahabr.ru/post/216189/
realcorwin
Уровень 14
21 декабря 2017, 13:57
Спасибо, интересная статья.

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