Почему `for (;; i )` работает точно так же, как `for (;; i)` в Java?

#java

#java

Вопрос:

Я имею в виду:

 for (int i = 0; i < 10; i  )
    System.out.println(i);
  

и

 for (int i = 0; i < 10;   i)
    System.out.println(i);
  

Даст те же результаты. i Вообще не вычисляется до завершения первого цикла?

Комментарии:

1. Не только в Java , но также в C и C .

2. bcoz этот оператор выполняется при переходе к следующей итерации, поэтому это не имеет значения

3. При рассуждении иногда полезно оспорить обратное: почему они не вели бы себя одинаково?

Ответ №1:

Потому что ваш for цикл эквивалентен этому:

 int i = 0;
while (i < 10) {
    System.out.println(i);
    i  ;
}
  

Операция после или предварительного увеличения вычисляется в конце (и ее возвращаемое значение отбрасывается), прежде чем условие проверяется на следующей итерации.

Они были бы совсем другими, если бы использовалось возвращаемое значение. Следующий код эквивалентен циклу выше:

 int i = 0;
while (i < 10) {
    System.out.println(i);
    i =   i; // pre
}
  

…но этот код создает бесконечный цикл ( i никогда не увеличивается):

 int i = 0;
while (i < 10) {
    System.out.println(i);
    i = i  ; // post
}
  

Предупреждение: Эти последние два примера специфичны для Java. Поведение в C и C не определено, и они вполне могут быть одинаковыми в вашем компиляторе.

Комментарии:

1. Красиво, именно так, как я бы это объяснил 🙂

Ответ №2:

Есть лишь небольшая разница в i и i :

  • i сначала возвращает значение i, а затем увеличивает его на единицу.
  • i сначала увеличивает значение i, а затем возвращает значение.

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

Ответ №3:

Используете ли вы i или i одно и то же, поскольку возвращаемое значение не используется. Выражение вычисляется после прохождения тела цикла и перед вычислением условия продолжения. Обратите внимание, что это два отдельных выражения. То есть они отличаются от:

 i   < 10
  i < 10
  

что дало бы разные результаты для i = 9 .

Ответ №4:

Вы правы. i и i дают одинаковые результаты, потому что они вычисляются в конце итерации и не используются.

Комментарии:

1. Не имеет значения, где в цикле происходит приращение, поскольку единственное различие между оператором с префиксом и оператором с постфиксом заключается в возвращаемом значении.

Ответ №5:

i И i отличаются тем, что они возвращают (их побочные эффекты одинаковы: увеличение i на единицу). В цикле for(start; condition; step) есть три выражения, но он просматривает только значение, возвращаемое condition . Хотя он выполняет step каждую итерацию, он просто удаляет результат, т.Е. step Имеет значение только побочный эффект.

Ответ №6:

Использование i означает, что i будет увеличен сразу после использования, а i означает, что i будет увеличен непосредственно перед использованием.

  i = 1;
 y = i  ;
  

y = 1, i = 2

  i = 1;
 y =   i;
  

y = 2, i = 2

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

  i  ; OR   i;
  

Оно увеличивается, а затем вычисляется в соответствии с вашим центральным условием.

Ответ №7:

Потому что так сказано в спецификации языка:

Если присутствует часть ForUpdate, выражения вычисляются последовательно слева направо; их значения, если таковые имеются, отбрасываются.