Вопрос:

Разница в реализации x = x + 1 и x ++

java bytecode

7908 просмотра

2 ответа

3165 Репутация автора

Мой профессор недавно сказал, что, хотя x = x + 1и x++, очевидно, даст тот же результат, есть разница в том, как они реализованы в JVM. Что это значит? Разве компилятор не похож: эй, я вижу, x++так что я переключу его x = x + 1и продолжу?

Я сомневаюсь, что есть разница, когда дело доходит до эффективности, но я был бы удивлен, если сборка будет отличаться в этих случаях ...

Автор: Eleeist Источник Размещён: 22.10.2013 08:29

Ответы (2)


26 плюса

176221 Репутация автора

Решение

Мой профессор недавно сказал, что хотя x = x + 1 и x ++, очевидно, дадут одинаковый результат

Я думаю, ваш профессор, возможно, имел в виду - ценность xпосле x = x + 1и x++будет такой же . Просто чтобы перефразировать, поскольку это, кажется, создает путаницу в интерпретации вопроса.

Ну, хотя значение xбудет одинаковым, они являются разными операторами и используют разные инструкции JVM в байт-коде. x + 1использует iaddинструкцию, тогда как x++использует iincинструкцию. Хотя это зависит от компилятора. Компилятор может использовать другой набор инструкций для конкретной операции. Я проверил это по javacкомпилятору.

Для компилятора eclipse , из одного из комментариев ниже от @Holger:

Я только что проверил это с моим затмением, и оно произвело iincдля обоих выражений. Итак, я нашел один компилятор, выдающий те же инструкции

Вы можете проверить байт-код с помощью javapкоманды. Давайте рассмотрим следующий класс:

class Demo {
    public static void main(String[] args) {
        int x = 5;

        x = x + 1;
        System.out.println(x);

        x++;
        System.out.println(x);
    }
} 

Скомпилируйте указанный выше исходный файл и выполните следующую команду:

javap -c Demo

Код будет скомпилирован в следующий байт-код (просто показывая mainметод):

 public static void main(java.lang.String[]);
   Code:
      0: iconst_5
      1: istore_1
      2: iload_1
      3: iconst_1
      4: iadd
      5: istore_1
      6: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      9: iload_1
     10: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
     13: iinc          1, 1
     16: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
     19: iload_1
     20: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
     23: return
Автор: Rohit Jain Размещён: 22.10.2013 08:32

7 плюса

32519 Репутация автора

Два выражения x++и x=x+1не дадут одинакового результата, ваш профессор не прав (или вы перепутали это с ++x, что опять-таки другое). Чтобы увидеть это

void notthesame() {
    int i = 0;
    System.out.println(i = i + 1);
    i = 0;
    System.out.println(i++);
    System.out.println("See?");
}

Следовательно, вопрос о байт-коде не имеет смысла, потому что 2 разных вычисления не могут иметь один и тот же байт-код.

Автор: Ingo Размещён: 22.10.2013 08:33
Вопросы из категории :
32x32