Post Increment Бесконечный цикл я + = я ++;

Я не понимаю, почему это уравнение приращения столбца не увеличивается. Я бы подумал, что после операции + = значение будет увеличиваться на 1, а затем во второй раз вокруг я будет иметь значение 1. Но выход представляет собой бесконечный цикл 0 нуля. Кто-нибудь может объяснить, почему "я" не увеличивается.

int i = 0;
for(; ; ) {
  if ( i >= 10) break;
  i += i++;
}
System.out.println(i);

Ответ 1

Хотя ответ из @njzk2 верен, полезно указать, почему оно правильно.

Существуют и другие возможности - например, почему Java не выполняет оператор postincrement после назначения? (Ответ: потому что это не то, что выбрали разработчики языка Java)

Порядок оценки составных присвоений (например, +=) указан в разделе 15.26.2 Спецификации языка Java. Я приведу как он определен для Java 8:

  • Сначала левый операнд оценивается для создания переменной. Если эта оценка завершается внезапно, то выражение присваивания внезапно завершается по той же причине; правый операнд не оценивается и никакого присваивания не происходит.

  • В противном случае значение левого операнда сохраняется, а затем оценивается правый операнд. Если эта оценка завершается резко, тогда выражение присваивания резко завершается для одна и та же причина и отсутствие назначения.

  • В противном случае сохраненное значение левой переменной и значение правого операнда используются для выполнения двоичной операции обозначенный оператором составного присваивания. Если эта операция завершается внезапно, тогда выражение присваивания резко завершается по той же причине, и никакого назначения не происходит.

  • В противном случае результат двоичной операции преобразуется в тип левой переменной, подвергается преобразованию набора значений (П. 5.1.13) до соответствующего стандартного значения (не значение расширенного значения экспоненты), и результат преобразования хранится в переменной.

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

Ответ 2

Рассмотрим i += i++;

i++ означает чтение значения для i, затем increment i.

i += x означает оценку i, затем оцените x и добавьте 2 и поместите результат в i.

Итак, что происходит:

  • i получает оценку 0
  • i++ оценивается. он возвращает 0, а значение для i равно 1
  • i += i++ теперь i = 0 + 0.
  • i = 0

Попробуйте с ++i, чтобы получить результат инкремента перед чтением его значения.

Ответ 3

Не удивительно, что вы попадаете в бесконечную петлю.

class Demo{
  public static void main(String[] args){
    int i = 0;
    for( ; ; ) {
        if (i >= 10) 
            break;
        i = i+i++;
        System.out.println(i);
    }
  }
}

Предположим, что приведенный выше код, я только что заменил вашу строку с помощью того, что компилятор заменит.

Теперь сначала я = 0; Итак,

i = i+i++

приводит к я = 0 + 0//, и теперь я равно 1

но в конце вы снова сделаете я равным 0!

Следовательно, бесконечность...