Что такое точность и ассоциативность для оператора приращения и оператора присваивания для блока кода

Что такое точность и ассоциативность для оператора приращения и оператора присваивания для блока кода

$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 Кто-нибудь может объяснить сценарий, как происходит исполнение?

4

Решение

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),

2

Другие решения

++ постинкрементный оператор первый возвращает значение и потом (пост) увеличивает значение. То есть $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 ошибка.

0

Это называется неопределенным порядком оценки.

Приоритет оператора и ассоциативность только определяют, как выражения
сгруппированы, они не указывают порядок оценки. PHP не
(в общем случае) укажите, в каком порядке находится выражение
оценивается и код, который предполагает определенный порядок оценки, должен
следует избегать, потому что поведение может меняться между версиями PHP или
в зависимости от окружающего кода.

http://php.net/manual/en/language.operators.precedence.php#example-130

Но текущее поведение никогда не менялось: http://3v4l.org/b1Y1X

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector