![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
|
|||||
|
Guest
Сообщений: n/a
|
По мере продолжения изучения грамматики AS, у меня возник вопрос - а зачем, собственно, нужна инструкция for (но не for(... in ...) - с ней понятно), если всё, что можно сделать с помощью этой инструкции можно сделать и с помощью инструкции while?
Смотрим определения в ECMA-262: IterationStatement : See 12.6 ................................................................ while ( Expression ) Statement for (ExpressionNoIn(opt); Expression(opt) ; Expression(opt) ) Statment ......................1.........................2......................3...................... ................................................................................................ (opt) означает, что это выражение -Expression, можно опустить. /Выражение 1/ выполняется один раз при инициализации инструкции for, поэтому его можно вынести из этой инструкции - ExpressionNoIn(opt);for (; Expression(opt) ; Expression(opt) ) Statement ..................1................................2................................3...................... /Выражение 3/ выполняется только тогда, когда выражение 2 имеет значение true, поэтому его тоже можно вынести из инструкции и записать в эквивалентном виде - ExpressionNoIn(opt);for (; Expression(opt) ; ) {Expression(opt);Statement}; ..................1................................2................................3................. a <for (; Expression(opt) ; )>- это в чистом виде <while ( Expression )> (если имеем <for(;;)> то тогда <while(true)>). Спрашивается - зачем плодить лишние инструкции????? Или я ошибаюсь??? Кстати замечаем, что везде в определении инструкций for и while используются Expression. Смотрим определение для Expression: Expression : See 11.14 AssignmentExpression Expression , AssignmentExpression те Expression - это любое конечное количество AssignmentExpression разделённых запятой!! Например: s=f,v>>k,c<d - это Expression, и a=(b=1+1,2+2) - это тоже Expression причём для вычисления ЗНАЧЕНИЯ Expression берётся ПОСЛЕДНЕЕ AssignmentExpression!! (в примере a=4,b=2); Это в некоторых случаях можно использовать в вычислениях. Рассмотрим вычисление факториала числа N в стандартном представлении с помощью цикла for: (для конкретности N=10) 1) ....... N=1; for (var i=1;i<=10;i++) N*=i; ....... А теперь запишем то же самое с помощью цикла while 2) N=i=1;while(N*=i,++i<=10); так вот - второй вариант на моём компе выполняется на 20% быстрее, чем первый!!! Впрочем, можно записать вычисления факториала и третьем варианте - 3) for (N=i=1;N*=i,++i<=10;); причём скорость вычисления 3-го варианта очень близка к скорости вычисления 2-го. По-видимому 3 и 2 транслируются в один и тот же код. Кстати, варианты 2 и 3 вызывают, по крайней мере у SWFscaner'a, лёгкую истерику - понять, что же делается в раскодированной инструции совершенно невозможно. Это тоже , я думаю, можно использовать ;). PS. Возможно это всё уже давным давно известно, и я изобретаю велосипед, но мне было бы интересно выслушать мнение флашеров по этому поводу. |
![]() |
Часовой пояс GMT +4, время: 11:57. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|