解释数组和++运算符的索引和值

时间:2019-03-26 12:35:32

标签: php php-7 php-7.2 post-increment

执行此代码时,我正在研究php7.2中的运算符优先级:

$i = 1;
$a[$i] = $i++;

var_dump($a);

$j = 1;
$b[$j++] = $j++;

var_dump($b);

我得到这个结果:

array(1) {
  [2]=>
  int(1)
}
array(1) {
  [1]=>
  int(2)
}

我不明白为什么这段代码会给出这些输出。我可以得到第一个var_dump,但是第二个似乎对我来说很奇怪。

您能否解释一下php如何逐步解释这两个示例?

我在php 4上没有得到相同的结果。

3 个答案:

答案 0 :(得分:2)

这里不再像其他人一样不经过测试/搜索就不知道他们在说什么,而是从这里开始调试了将PHP转换为byteCode时所分析的方式。

https://derickrethans.nl/projects.html#vld

我没有足够的时间自己做。

祝你好运!

答案 1 :(得分:1)

我想通了,这全都与运算符的优先级有关。

正在按以下顺序处理运算符:

  1. [
  2. ++(从左到右)
  3. =

以下步骤中正在解释以下代码:

$i = 1;
$a[$i] = $i++;
  1. $ i ++返回1,然后递增
  2. $ a [$ i]被分配了$ i === 2
  3. $ a [2]被分配了步骤1的返回值。因此$ a [2] === 1

并使用以下代码:

$j = 1;
$b[$j++] = $j++;
  1. 左侧$ j ++返回1,而$ j正在递增
  2. 右边的$ j ++返回2(因为它已在步骤1中递增),并且$ j再次递增。此时,$ j === 3
  3. 分配$ b [1]是因为第一步返回1。
  4. $ b [1]被分配了步骤2的返回值。因此$ b [1] === 2

因此,最后一个示例几乎执行以下操作:

function incrementInteger(int &$i): int
{
    ++$i;
    return $i - 1;
}

$j = 1;
$b[incrementInteger($j)] = incrementInteger($j);

答案 2 :(得分:1)

即使C ++是一种编译时语言,在x = x++之类的指令上也没有标准行为,并且编译器之间的结果也不同。

PHP已在运行时进行了预编译,因此在编译时间执行时间方面对性能进行了优化。 行为未定义,并且可能因版本而异。

您永远都不应在一条指令中依赖这样的构造-除非语言规范中对其进行了明确定义,否则没有任何语言。