|
Guest
|
Занимательный ActionScript ('for' <--> 'while')
По мере продолжения изучения грамматики 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. Возможно это всё уже давным давно известно, и я изобретаю велосипед, но мне было бы интересно выслушать мнение флашеров по этому поводу.
|