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

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

Статья из группы Архив 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
Попробуйте так : int i = 0; i = ++i; System.out.println(i);
fatfaggy Уровень 26
23 декабря 2017
как я понимаю, эта задачка скорее просто размять мозги? ну или из серии «удивительное рядом»?)
потому что я не вижу прикладной ценности в ней. в том плане, что мало кто станет всерьез в своем коде делать что-то типа такого:
i = i++;

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

        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
Ясно. Никто :).