Просмотр полной версии : Порядок вычисления аргументов функции
Недавно вышел у нас спор о легитимности присвоения нового значения аргументу функции, если этот аргумент передается в функцию более одного раза (чтобы было понятнее - пример):
new Date(now.fullYear, ++now.month, 0);
now - какая-то дата. Смысл спора в том, на сколько вправе программист предполагать, что порядок вычисления параметров будет всегда слева нaправо, и что год будет посчитан для даты до того, как она будет изменена (и если это был последний месяц, то может получится, что год будет следующим годом, хотя это совсем не то, что требовалось). Я искал в справке информацию по этому поводу, но что-то ничего такого пока не нашел. Технически, я пока еще не видел, чтобы аргументы вычислялись в другом порядке, но если ружжо висит на стенке, то когда-нибудь обязательно выстрелит...
var o:Object = {b:1};
o.a = function(){this.b++;return 2;};
trace(calc(o.b,o.a()));
}
private function calc(x:int , y:int):int
{
trace(x,y);
return x + y;
}
Выведет : 1 ,2 ,3
var o:Object = {b:1};
o.a = function(){this.b++;return 2;};
o.a();
trace(calc(o.b,o.a()));
}
private function calc(x:int , y:int):int
{
trace(x,y);
return x + y;
}
Выведет : 2 ,2 ,4
Видимо ,сначала в функцию передаются аргументы, а потом начинается обработка этих аргументов
Genzo - ww спрашивает на сколько понял о другом.
типа function(a, b):void { first init a or b ? }
Тут дело немного в другом :
function(a, b()):void { first init a or b ? }
Сначала в функцию передадутся параметры a и то что возвращает b, но даже если b изменит a, а уже передалось в том виде в котором было, соответственно верно предположить что порядок передачи аргументов идет слева направо.
Вообще-то
Смысл спора в том, на сколько вправе программист предполагать, что порядок вычисления параметров будет всегда слева нaправо
Здесь должна была быть шутка про письмо справа налево
Думаю программист вправе. Но я лучше заведу лишнюю переменную, пожертвовав "красотой" решения.
Спор о легитимности в программировании. Вкусно, как орбит-анонимная_функция.
Я к тому, что предположим в Си порядок вычисления аргументов не определен, и каждый компилятор делает это в меру своей испорченности - по-разному, некоторые компиляторы могут даже в пределах одной функции делать это то справа налево, то слева направо. Таким образом, код типа f(i, ++i) в Си счиается непортабельным. В некоторых других языках порядок вычисления аргументов изначально оговорен, и (например в Common Lisp) код (f i (setf i (1+ i))) вполне себе портабельный (но, например, в Scheme тот же самый код - не портабельный, да и вообще не правильный, т.как порядок вычисления не определен).
Я искал похожую информацию про AS3 - в том смысле, что я думал, что, например, в статье про Function это должно было бы быть оговорено - ан нет...
Легитимность, выходит, на вкус компилятора.
Максимум, что я себе позволяю: items.splice(i--, 1);
Но это совершенно однозначный код.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.