Для циклов в java и значений i

В учебнике Хорстманна (Big Java Late Objects) по java для цикла for, такого как:

for (i = 0; i <= 5; i++)

Хорстманн говорит, что значение i для этого цикла for равно 0 1 2 3 4 5.

Однако мне кажется, что значение i должно заканчиваться на 6, поскольку цикл вводится, когда i имеет значение 5. Что я не понимаю в этих петлях, может кто-нибудь мне объяснить?

(PS. Прошу прощения, если вопрос слишком простой и поэтому не разрешен на этой платформе.)

изменить повторяющееся предложение: мой вопрос не является дубликатом предложенной ссылки, потому что предлагаемая ссылка касается выполнения цикла for, мой вопрос касается обновления переменной i после завершения выполнения. Я понимаю, что если я добавлю оператор System.out.print (i), результат будет 0 1 2 3 4 5, потому что я обновляется после оператора выполнения (в данном случае оператора печати)

Возможный дубликат Как цикл for проверяет свои условия в Java?

Johan 12.10.2018 10:49

Да, но в принятом ответе в дубликате также указано, что обновление i выполняется после выполнения тела (до условия завершения). Автор этого вопроса первоначально спросил, почему цикл печатает i=5, когда условие было установлено на i<5 (это произошло потому, что автор объединил оператор печати с частью приращения.

Johan 12.10.2018 11:14

Это убедительный ответ, и я готов удалить этот вопрос, поскольку он дублируется. Однако я также думаю, что не должен, потому что ответ @Roger Lindsjö больше освещает те, которые были даны в качестве ответа на предложенный пост. В этом случае мне кажется, что есть ничья, и я готов действовать в соответствии с предложением о разрешении ничьей.

betaD 12.10.2018 11:43

Я думаю, вы должны учитывать разницу между тем, что можно наблюдать (максимальное значение i, видимое внутри тела цикла, равно 5) и тем, что происходит «под капотом» (i становится 6, поэтому цикл завершается)

Mark Rotteveel 12.10.2018 17:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
337
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Эта петля

for ( i = 0; i <=5; i ++)

как

int i = 0;

while (i <= 5){  // Exits when i > 5

   ...

   i++;
} // goes back to while-loop check

Вот анатомия цикла for в Java (аналогично C / C++ и некоторым другим языкам)

for (int i=0; i <= 5; ++i)

int i=0     initial condition; happens before the loop starts
i <= 5      check is performed BEFORE each iteration of the loop
++i         loop variable is incremented AFTER each iteration

Итак, ваш цикл for будет повторяться 5 раз, и в конце пятой итерации значение i будет увеличено до 6. В этот момент проверка i <= 5 произойдет в последний раз, и она завершится неудачно, поскольку 6 больше, чем 5. .

Чтобы убедиться во всем этом, запустите следующий код Java:

int i;
for (i=0; i <= 5; ++i) {
    // empty
}
System.out.println(i);

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

Это более подробный ответ, чем мой, Хорошая работа

SamHoque 12.10.2018 10:52

Значение I будет заканчиваться на 5, потому что вы выполняете i <= 5. Он проверяет, больше ли I или равен 5, а затем завершает цикл. следовательно, он заканчивался на 5, а не на 6.

Что ж, мужик прав! он повторяется от 0 до 5, потому что ... 1. условие: «i <= 5» 2. Java имеет индекс 0, или, если быть точным, объявив и инициализировав переменную i = 0, она начнет итерацию с 0 до тех пор, пока условие не вернет false. Решающим моментом здесь является условное давление внутри цикла for. Вы понимаете?

Это рабочая последовательность со значениями, чтобы увидеть, что именно происходит:

i=0 

//tasks

i++ 

i=1 check i<=5 //ok

//tasks

i++

i=2 check i<=5 //ok 
//tasks

i++

i=3 check i<=5 //ok 
//tasks

i++

i=4 check i<=5 //ok 
//tasks

i++

i=5 check i<=5 //ok 
//tasks

i++

i=6 check i<=5 //it's not ok

// exit the loop

Вы правы, что значение i увеличивается до 6, а затем условие цикла не выполняется и цикл завершается. Однако автор пытается передать, что значения i, для которых будет выполняться блок цикла for, - это 0, 1, 2, 3, 4, 5.

Ответ принят как подходящий

Вы правы, что значение i будет 6 после завершения цикла, но, возможно, Хорстманн имел в виду значения i внутри цикла?

int i;
for (i = 0; i <= 5; i++) {
    System.out.println("Value of i IN loop: " + i);
}
System.out.println("Value of i AFTER loop: " + i);

Выход:

Value of i IN loop: 0
Value of i IN loop: 1
Value of i IN loop: 2
Value of i IN loop: 3
Value of i IN loop: 4
Value of i IN loop: 5
Value of i AFTER loop: 6

И обычно объявляют «счетчик» для цикла в цикле, если значение при завершении не требуется впоследствии.

for (int i = 0; i <= 5; i++) {
}
// i is not available here

В этом есть большой смысл, ведь это напомнило мне, что переменная i существует только внутри цикла foor и «умирает», когда цикл больше не выполняется.

betaD 12.10.2018 11:11

Цикл for завершится на 5, поскольку условие в вашем цикле - i<=5, что означает, что цикл остановится, если он достигнет числа 5.

Другие вопросы по теме