#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, выражения вычисляются последовательно слева направо; их значения, если таковые имеются, отбрасываются.