PHP中的递增/递减运算符优先级

时间:2012-12-29 03:20:15

标签: php operator-precedence

有人可以帮助我解决这段代码,因为它似乎没有遵循PHP中增量/减量运算符的优先级和关联性原则:(这是来自PHP手动增量/减量运算符页面中的注释 - http://php.net/manual/en/language.operators.increment.php

第一个例子 -

$a = [ 0, 1, 2 ];
$i = 0;
$a[$i++] = $i;

var_dump( $a );

/ *这是输出:

array (size=3)
  0 => int 1
  1 => int 1
  2 => int 2

以下是我对正在发生的事情的解释:

1. Array index gets calculated, so $a[$i++] is $a[0]
2. Then rval gets calculated (which after $i++ in the step above) is now 1
3. The value of the expression gets calculated which is  1.

到目前为止一切顺利。 * /

第二个例子 -

$a = [ 0, 1, 2 ];
$i = 0;
$a[$i] = $i++;

var_dump( $a );

/ *这是输出:

array (size=3)
  0 => int 0
  1 => int 0
  2 => int 2

以下是我对正在发生的事情的解释:

1. The array index gets calculated which should be 0 ($a[0]), but ACTUALLY it is 1 ($a[1])
2. The rval gets calculated , which is $i++ , so the value now is 0.
3. The expression value gets calculated , which should be 1 after $i++ in the step above,   but ACTUALLY it is 0.

所以从根本上说,我无法理解上面第二个例子中的步骤1和3。 * /

2 个答案:

答案 0 :(得分:2)

来自与您的代码相同的评论:

  

分配索引表达式和值表达式都会在任何实际分配发生之前进行评估,这意味着您放置帖子incr / decr的任何内容都可能无法获得您想到的结果。

$a[$i++] = $i;行上,LHS上的索引表达式$i++和RHS上的值表达式$i正在进行分配之前进行评估。

答案 1 :(得分:1)

这与增量的优先级没有太大关系,与赋值运算符的优先级有关。将首先评估任何赋值表达式的左侧。

在上面的第一种情况中,这会选择a[0]作为要分配的位置,增加$i,然后执行$i的分配,现在是1 }。