|
|
|||||
Регистрация: Jul 2009
Сообщений: 77
|
циклы: значение счетчика на выходе
выдаёт 5, почему, ведь в последнем цикле i=4?
|
|
|||||
listener
|
Видимо, i все-таки 5 по окончании цикла. Ваш код эквивалентен следующему
Ваш ролловер просто выводит последнее значение переменной i, а оно равно 5. |
|
|||||
Модрон-ветеринар
|
Видимо, сперва происходит приращение, затем формальный прогон вычислений внутри цикла, в конце тела - заход на новый виток проверка условия с новым значением счетчика.
Если условие выполняется, то происходит реальное выполнение (применение) уже формально выполненных вычислений тела цикла. Если условие не выполняется, реальный результат последних вычислений НЕ принимается и происходит останов. Но трейс-то уже произошел. Либо для примера автора - функция обработки на кнопку уже назначилась. Трейс или назначение функции на событие, видимо, не считается вычислением и под отмену не подпадает, будучи уже свершившейся операцией. Как происходит на деле - не знаю, вышеописанное - это я так понял. Программисты все правильно объяснят. Автору - при использовании ссылки на функцию - тогда все в порядке: Последний раз редактировалось mooncar; 18.09.2009 в 10:26. |
|
|||||
Регистрация: Jul 2009
Сообщений: 77
|
2 alexcon314: да эквивалентен, но последний цикл заканчивается на i=4; почему становится i=5?
2 mooncar: но как вы объясните код alexcon314 выше? |
|
|||||
Модрон-ветеринар
|
Ошибся - UPD:
Cперва происходит приращение, затем формальный прогон вычислений внутри цикла, в конце тела - заход на новый виток и проверка условия с новым значением счетчика. То есть внутри интерпретатора - для вычислений цикл заканчивается на 5, но если условие при заходе по новой не выполняется, результаты вычислений не используются. Но трейс при этом уже был. Тут нужно низкоуровневое осмысление этого процесса. Видимо так сделано в угоду производительности вычислений. Вычисления уже готовы, а вот использовать их или нет - завист от условия. Добавлено через 8 минут Еще такая версия - язык "не понимает", что такое "<" - то есть меньше. Вычисление сравнения - сложная операция. Интерпретатор скорее всего проверяет равенство. Если числа равны, то результат последних вычислений не принимается. Это мне кажется наиболее правильным объяснением. Последний раз редактировалось mooncar; 18.09.2009 в 10:30. |
|
|||||
Модрон-ветеринар
|
Последняя версия событий такова:
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-ой не используется в одних случаях (дальнейшие вычисления в коде) и используется в других (трейс и создание функций). Последний раз редактировалось mooncar; 18.09.2009 в 11:02. |
|
|||||
listener
|
Последняя версия событий такова:
1. Начало цикла. i = 0 2. Проверка условия i < 5. - если дает true, то выполняется все, что в теле цикла, в моем примере это trace(i);. - если дает false, то переходим на 4. 3. Происходит приращение i = i + 1 и переход на 2. 4. Выход из цикла (выполняется следующая после цикла строчка кода). Тогда будет именно такая картина, которую наблюдаем на практике. То, что в примере автора в теле цикла выполняется присвоение обработчика ролловер кнопки, никакого значения не имеет, т.е. после выхода из цикла i=5. PS. Обработчик ролловер, аж 5(!) раз назначенный в цикле, честно трейсит i. Назначение обработчика само по себе не что иное, как операция присваивания, т.е. можно было с тем же успехом написать И чему бы вы думали будет равно а на каждой итерации и после выхода из цикла? Последний раз редактировалось alexcon314; 18.09.2009 в 11:22. |
|
|||||
Модрон-ветеринар
|
Угу. То есть на кнопке обработчик просто выводит i - то есть то значение, что осталось в ячейке памяти с именем «i»?
Аминь. А я-то такую версию выстроил. Все-таки только мне кажется что проверяется равенство, а не "меньшесть". Больше-меньше - это языку вычислять нужно, а равенство механизм языка простой побитной эквивалентностью получить может. Последний раз редактировалось mooncar; 18.09.2009 в 11:25. |
Часовой пояс GMT +4, время: 21:15. |
|
« Предыдущая тема | Следующая тема » |
|
|