Код выглядит так:
открытый класс testplusplus {public static void main (string [] args) {int k = addafterReturn (10); System.out.println (k); // Вывод 10 int k1 = addbeforereturn (10); System.out.println (K1); // вывод 11} public static ind addbeforereturn (int i) {return ++ i; } public static indAdfterReturn (int i) {return i ++; }}С уровня байт -кодов,
Bytecode of AddedAfterReturn заключается в следующем:
0: iload_01: iinc 0, 14: Ireturn
Это просто, Iload_0 означает размещение значения элемента, индексированного в 0 в таблице локальных переменных в верхнюю часть стека. Поэтому значение, которое я прошел, помещается в верхнюю часть стека, а IINC 0,1 означает разместить таблицу локальных переменных
Элементы с индексом 0 добавляются в 1, и, наконец, Иретерн помещает значение int в верхней части стека в кадр стека вызывающего абонента. (Стеки здесь - это стеки операндов)
Поэтому IINC 0 и 1 на самом деле не влияют на возвращаемое значение, поэтому возврат все еще 10.
Точно так же, Bytecode AddBeForerTurn выглядит следующим образом:
0: iinc 0, 13: iload_04: Ireturn
Я оставлю это всем для их собственного анализа. На самом деле, очевидно, что это сначала увеличивает, а затем помещает его в стек. Таким образом, возвращаемое значение фактически увеличивается.
Теперь давайте сделаем вопрос об интервью, который я исправил сам.
открытый класс testplusplus2 {static {x = 5; int y = 10; } static int x, y; public static void main (string args []) {x--; mymethod (); System.out.println (x+y++++ x); } public static void mymethod () {y = x +++++ x; }}Вы знаете ответ? Запустите его, правильный ответ - 23.
Если вы действительно понимаете вышеперечисленное, этот вопрос также очень прост. Прежде всего, вы знаете значения X и Y, прежде чем выполнять Main. Это включает в себя механизм загрузки класса. Стадия подготовки загрузки класса назначит статическую переменную к нулевому значению этого типа. Если INT INT, это соответствует 0. На стадии инициализации класса статические блоки и поведение назначения статической переменной в классе собираются в соответствии с порядком кода для генерации метода. Следовательно, в этом тесте x = 5, y = 0;
Продолжайте анализировать, x--' ,所以x = 4,y = 0, myMethod 中y = x++ + ++x;
x ++ не добавит 1 перед выполнением последующей операции с добавлением, точно так же, как return i ++ только после возврата (вы можете понять возвращение как операция стека Iload, а не инструкция Iretrun), поэтому первое добавление - 4, но здесь следует отметить, что перед выполнением ++ x увеличение уже оказало влияние на фактическое x, то есть x, x уже 5, то, что является вторым аддер, так и 6, и 6.
Тогда очень просто x+y ++ x - 6+10+7 - 23. К счастью, если вы можете понять байт -код, вы можете перевести байт -код кода и использовать байт -код для его проверки, и вы также можете найти такие результаты.
Давайте посмотрим на другой пример, который был предоставлен большими парнями в группе. Я думаю, что это тоже очень просто.
public static int plus (int i) {try {++ i; System.out.println ("try"); вернуть i ++; } наконец {System.out.println ("наконец -то"); i ++; // вернуть I; }} public static void main (string [] args) {System.out.println (test1.plus (5));}Можете ли вы придумать, сколько является окончательный результат? Если вы удалите комментарии, именно поэтому вы не возвращаетесь в блоке, наконец,. Потому что независимо от того, является ли это правильным или неправильным, определенное значение всегда может быть возвращено.
Суммировать
Выше приведено подробное объяснение вопросов I ++ и ++ I в Java Questions, представленных редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!