Сегодня узнал что PHP очень интересно работает с выражениями: влоб.
То есть, если вы хотите поиграться с каким-нить действом вроде такого: $i++ + f(++$i) - вас ждёт облом. Никто и не собирался считать значения $i заранее и менять после выражения. Отнюдь. Пост и пре инкремент будет отработан прям на месте, но, значение в каждое конкретное место будет подставлено после этой обработки. то есть:
$i=3;
[3]$i++[4] + f([5]++$i[5]);
3 коммент.:
Такой же прикол есть в Си. Результат выражения, который использует значение переменной, которая изменялась тут же не определен. Классика - (i++ + ++i). Если между изменением и использованием есть sequence point, то всё ок. В Си выражение i++ + f(++i) вычисляется совершенно определенным образом, так как тут есть S.P.:
i=i+1;
temp=f(i);
i=i+1;
result=temp+i;
Интересно хоть где-нибудь в доках по ПХП порядок вычисления выражений с side эффектами специфицирован, или они вычисляются как попало?
В Си морфах этот эффект документирован. А в PHP я документированности этого бреда не встречал.
Кстати я гоню, SP между вычислением параметров и вызовом функции, а между вычислением первого слагаемого и параметров функции SP нет; так что в Си тут UB.
Я бы мог написать что раз так, то PHP отстой, но не буду этого делать :)
Отправить комментарий