Что такое точность и ассоциативность для оператора приращения и оператора присваивания для блока кода
$a=array(1,2,3);
$b=array(4,5,6);
$c=1;
$a[$c++]=$b[$c++];
print_r($a);
В соответствии с исполнением он выводит
Array
(
[0] => 1
[1] => 6
[2] => 3
)
Но я не могу понять, как массив $a
индекс 1 содержит значение массива $b
значение индекса 2 Кто-нибудь может объяснить сценарий, как происходит исполнение?
PHP (еще раз) отличается от других языков тем, что оставил часть задания оценивается первой. Простое доказательство:
$a[print 1] = $b[print 2]; // what does this print?
В соответствии с http://3v4l.org/, этот код:
$a = array(); $b = array(); $c = 1;
$a[$c++]=$b[$c++];
генерируются следующие коды операций:
compiled vars: !0 = $a, !1 = $b, !2 = $c
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2 0 > INIT_ARRAY ~0
1 ASSIGN !0, ~0
2 INIT_ARRAY ~2
3 ASSIGN !1, ~2
4 ASSIGN !2, 1
3 5 POST_INC ~5 !2
6 POST_INC ~7 !2
7 FETCH_DIM_R $8 !1, ~7
8 ASSIGN_DIM !0, ~5
9 OP_DATA $8, $9
10 > RETURN 1
Код операции 5 является оставил $c++
и код операции 6 является право $c++
, Таким образом, окончательное назначение (код операции 8) оценивается как
$a[1] = $b[2];
что приводит к (1,6,3)
,
++
постинкрементный оператор первый возвращает значение и потом (пост) увеличивает значение. То есть $c++
возвращает значение $c
, затем приращений $c
,
Тогда, очевидно, выполняется так:
$a[$c++] =
Здесь значение $c++
принимается как 1
, но $c
затем пост-увеличивается до 2
,
$b[$c++]
Здесь значение $c++
принимается как 2
, а потом $c
пост-увеличен до 3
(о котором никто больше не заботится).
Таким образом, выражение эквивалентно:
$a[1] = $b[2];
Для контраста оператор предварительного увеличения ++$var
первый увеличивает значение, затем возвращает новое увеличенное значение. Так $a[++$c] = $b[++$c]
приведет к Неопределенное смещение 3 в $b
ошибка.
Это называется неопределенным порядком оценки.
Приоритет оператора и ассоциативность только определяют, как выражения
сгруппированы, они не указывают порядок оценки. PHP не
(в общем случае) укажите, в каком порядке находится выражение
оценивается и код, который предполагает определенный порядок оценки, должен
следует избегать, потому что поведение может меняться между версиями PHP или
в зависимости от окружающего кода.
http://php.net/manual/en/language.operators.precedence.php#example-130
Но текущее поведение никогда не менялось: http://3v4l.org/b1Y1X