4

代码块的增量运算符和赋值运算符的精度和关联性是什么

$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

3 回答 3

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

于 2014-09-22T09:29:10.210 回答
0

它被称为未定义的评估顺序。

运算符优先级和关联性仅确定表达式的分组方式,它们不指定评估顺序。PHP 没有(在一般情况下)指定表达式的求值顺序,并且应该避免假定特定求值顺序的代码,因为行为可能会在 PHP 版本之间或取决于周围的代码而改变。

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

但目前的行为从未改变:http: //3v4l.org/b1Y1X

于 2014-09-23T01:01:54.277 回答
0

++ 后递增运算符首先返回值,然后(后)递增值。即$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出错。

于 2014-09-22T09:17:02.643 回答