PDA

Просмотр полной версии : Порядок вычисления аргументов функции


wvxvw
21.10.2011, 16:01
Недавно вышел у нас спор о легитимности присвоения нового значения аргументу функции, если этот аргумент передается в функцию более одного раза (чтобы было понятнее - пример):
new Date(now.fullYear, ++now.month, 0);
now - какая-то дата. Смысл спора в том, на сколько вправе программист предполагать, что порядок вычисления параметров будет всегда слева нaправо, и что год будет посчитан для даты до того, как она будет изменена (и если это был последний месяц, то может получится, что год будет следующим годом, хотя это совсем не то, что требовалось). Я искал в справке информацию по этому поводу, но что-то ничего такого пока не нашел. Технически, я пока еще не видел, чтобы аргументы вычислялись в другом порядке, но если ружжо висит на стенке, то когда-нибудь обязательно выстрелит...

Genzo
21.10.2011, 16:45
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

Видимо ,сначала в функцию передаются аргументы, а потом начинается обработка этих аргументов

in4core
21.10.2011, 16:49
Genzo - ww спрашивает на сколько понял о другом.

типа function(a, b):void { first init a or b ? }

Genzo
21.10.2011, 16:53
Тут дело немного в другом :
function(a, b()):void { first init a or b ? }
Сначала в функцию передадутся параметры a и то что возвращает b, но даже если b изменит a, а уже передалось в том виде в котором было, соответственно верно предположить что порядок передачи аргументов идет слева направо.

GBee
21.10.2011, 17:24
Вообще-то
Смысл спора в том, на сколько вправе программист предполагать, что порядок вычисления параметров будет всегда слева нaправо

Здесь должна была быть шутка про письмо справа налево

Думаю программист вправе. Но я лучше заведу лишнюю переменную, пожертвовав "красотой" решения.

dimarik
21.10.2011, 20:29
Спор о легитимности в программировании. Вкусно, как орбит-анонимная_функция.

wvxvw
21.10.2011, 21:37
Я к тому, что предположим в Си порядок вычисления аргументов не определен, и каждый компилятор делает это в меру своей испорченности - по-разному, некоторые компиляторы могут даже в пределах одной функции делать это то справа налево, то слева направо. Таким образом, код типа f(i, ++i) в Си счиается непортабельным. В некоторых других языках порядок вычисления аргументов изначально оговорен, и (например в Common Lisp) код (f i (setf i (1+ i))) вполне себе портабельный (но, например, в Scheme тот же самый код - не портабельный, да и вообще не правильный, т.как порядок вычисления не определен).
Я искал похожую информацию про AS3 - в том смысле, что я думал, что, например, в статье про Function это должно было бы быть оговорено - ан нет...

dimarik
21.10.2011, 22:21
Легитимность, выходит, на вкус компилятора.

etc
22.10.2011, 00:05
Максимум, что я себе позволяю: items.splice(i--, 1);
Но это совершенно однозначный код.