![]() |
циклы: значение счетчика на выходе
Код AS1/AS2:
|
Видимо, i все-таки 5 по окончании цикла. Ваш код эквивалентен следующему
Код:
for (i = 0; i < 5; ++i) { |
Видимо, сперва происходит приращение, затем формальный прогон вычислений внутри цикла, в конце тела - заход на новый виток проверка условия с новым значением счетчика.
Если условие выполняется, то происходит реальное выполнение (применение) уже формально выполненных вычислений тела цикла. Если условие не выполняется, реальный результат последних вычислений НЕ принимается и происходит останов. Но трейс-то уже произошел. Либо для примера автора - функция обработки на кнопку уже назначилась. Трейс или назначение функции на событие, видимо, не считается вычислением и под отмену не подпадает, будучи уже свершившейся операцией. Как происходит на деле - не знаю, вышеописанное - это я так понял. Программисты все правильно объяснят. :) Автору - при использовании ссылки на функцию - тогда все в порядке: Код AS1/AS2:
|
2 alexcon314: да эквивалентен, но последний цикл заканчивается на i=4; почему становится i=5?
2 mooncar: но как вы объясните код alexcon314 выше? |
Ошибся - UPD:
Cперва происходит приращение, затем формальный прогон вычислений внутри цикла, в конце тела - заход на новый виток и проверка условия с новым значением счетчика. То есть внутри интерпретатора - для вычислений цикл заканчивается на 5, но если условие при заходе по новой не выполняется, результаты вычислений не используются. Но трейс при этом уже был. Тут нужно низкоуровневое осмысление этого процесса. Видимо так сделано в угоду производительности вычислений. Вычисления уже готовы, а вот использовать их или нет - завист от условия. Добавлено через 8 минут Еще такая версия - язык "не понимает", что такое "<" - то есть меньше. Вычисление сравнения - сложная операция. Интерпретатор скорее всего проверяет равенство. Если числа равны, то результат последних вычислений не принимается. Это мне кажется наиболее правильным объяснением. |
Цитата:
|
Последняя версия событий такова:
1. Начало цикла. i = 0 2. Проверка условия i = 5. (а не "i < 5" !) Если дает НЕТ, то из оперативного хранилища результат предыдущих вычислений цикла (если они были) используется где-то в коде дальше (то есть у этих результатов механизм языка ставит отметку "разрешаю к использованию") и одновременно происходит переход к (3). Если i = 5 дает ДА, то СТОП и стирание результатов предыдущего шага (если был). 3. Производятся вычисления. 4. Результат вычислений откладывается в оперативное хранилище. 5. Происходит приращение i = i + 1 6. Переход в (2) Тогда будет именно такая картина, которую наблюдаем на практике. 1. Трейс. Трейс происходит на этапе 3 и, вероятно, работа с окном вывода не связана с оперативным хранилищем и метка о разрешении использования результатов тут нигде не проверяется, а вывод в окно происходит сразу, вроде "стандартного вывода". То же, видимо, и с описанием анонимной функции примера автора: 2. Назначение функции. В процессе вычислений (этап 3) для кнопки создается функция обработки события и она становится атрибутом самой кнопки и с результатами вычислений становится никак не связана, то есть ее нельзя "отменить" или "не использовать" в зависимости от метки "разрешено к использованию" И 5-ка будет последним значением i. Если на пальцах - то просто результат с 5-ой не используется в одних случаях (дальнейшие вычисления в коде) и используется в других (трейс и создание функций). |
Последняя версия событий такова:
1. Начало цикла. i = 0 2. Проверка условия i < 5. - если дает true, то выполняется все, что в теле цикла, в моем примере это trace(i);. - если дает false, то переходим на 4. 3. Происходит приращение i = i + 1 и переход на 2. 4. Выход из цикла (выполняется следующая после цикла строчка кода). Тогда будет именно такая картина, которую наблюдаем на практике. То, что в примере автора в теле цикла выполняется присвоение обработчика ролловер кнопки, никакого значения не имеет, т.е. после выхода из цикла i=5. PS. Обработчик ролловер, аж 5(!) раз назначенный в цикле, честно трейсит i. Назначение обработчика само по себе не что иное, как операция присваивания, т.е. можно было с тем же успехом написать Код:
for (i = 0; i < 5; ++i) { |
Угу. То есть на кнопке обработчик просто выводит i - то есть то значение, что осталось в ячейке памяти с именем «i»?
Аминь. А я-то такую версию выстроил. Все-таки только мне кажется что проверяется равенство, а не "меньшесть". Больше-меньше - это языку вычислять нужно, а равенство механизм языка простой побитной эквивалентностью получить может. |
Ну да. Именно "что осталось" и выводит.
|
Все прояснилось.
Название темы бы еще поправить.. :) |
понятно, спасибо.
|
| Часовой пояс GMT +4, время: 10:05. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.